您的位置:首页 > 编程语言 > Python开发

Python sqlite的一些问题

2013-09-12 20:16 267 查看

写在前面

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函数,否则数据并不会持久化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python