Python sqlite的一些问题

本文探讨了Python中SQLite数据库连接(connection)与游标(cursor)的关系,并通过代码示例详细解释了execute等方法的工作原理及如何正确使用commit来确保数据持久化。

写在前面


1、为什么要写这篇文章?由于经常被 bhq鄙视,不思考问题,所以向他说明其实我每天都在思考。
2、本文用的python版本是3.x,为什么,原因很简单,因为在3.x里面,print是一个函数,必须要加括号。

connection和cursor之间的关系

他们之间的关系其实很简单, cursor = connection.cursor()
其实我真正想说的是,这两个类都有execute, executemany, executescript等一系列函数,那么这些函数之间的关系是什么呢?拿execute函数为例,文档上面是这么描述connection的execute函数的:

This is a nonstandard shortcut that creates an intermediate cursor object by calling the cursor method, then calls the cursor’s execute method with the parameters given.

意思就是说,这个函数实际上内部就是调用了connection.cursor函数,获得一个cursor对象,然后调用这个cursor的execute函数。那么具体情况如何呢?其实我们可以参看以下pypy的源码,看看他的connection.cursor函数的实现,地址在此

代码如下:

    def execute(self, *args):
        self._check_closed()
        cur = Cursor(self)
        if self.row_factory is not None:
            cur.row_factory = self.row_factory
        return cur.execute(*args)

原来这个函数还返回一个cursor对象,这点文档里面倒是没有提到啊。

对于其他函数的具体细节,也可以参考pypy的实现。


建立测试数据库,代码如下:


conn = sqlite3.connect("test.db")
sql = 'create table user(name TEXT, age INTEGER)'
conn.execute(sql)

关于autocommit的一些讨论

1、默认是自动commit的吗?

测试代码:

conn = sqlite3.connect("test.db")
sql = 'insert into user values(?, ?)'
conn.execute(sql, ('name', 25))


通过查询数据库,发现数据并没有插入到数据库,这就说明,插入一条数据的时候,确实需要调用connection的commit方法

2、这个是不是自动commit?

测试代码:

conn = sqlite3.connect("test.db")
sql = 'insert into user values(?, ?)'
conn.execute(sql, ('name', 25))
sql = 'select * from user'
cursor = conn.execute(sql)
for row in cursor:
	print(row)

输出:
('name', 25)


看样子,好像数据已经commit进了数据库,但是通过sqlite shell,执行select * from user,发现数据库里面还是空的。


综上得出结论,除非调用connection的commit函数,否则数据并不会持久化。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值