写在前面
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))
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函数,否则数据并不会持久化。