我通过以下查询创建了一个表:
with sqlite3.connect('example.db', detect_types=sqlite3.PARSE_DECLTYPES) as conn:
cur = conn.cursor()
cur.execute("CREATE TABLE Surveys(Id INTEGER PRIMARY KEY, Name TEXT, Desc TEXT, DictObject BLOB, Hash TEXT)")
conn.commit()
现在,我必须为每个请求向Survey
表添加一些Surveys
数据。 Surveys
表的Id
为主整数值。这必须在每次插入时增加 - 并且正确的方法是什么?我是否必须获取每一行并检查每个请求的最后Id
是什么?
答案 0 :(得分:2)
sqlite
将automatically provide an id for a INTEGER PRIMARY KEY column对表上的INSERT a sqlite3
connection as a context manager。只需为id
列的 列插入数据。
with sqlite3.connect('example.db', detect_types=sqlite3.PARSE_DECLTYPES) as conn:
cur = conn.cursor()
cur.execute("INSERT INTO Surveys(Name, Desc, DictObject, Hash) VALUES (?, ?, ?, ?",
('somename', 'some description\nof sorts\n',
"{'dump': 'of a dictionary'}", '0xhash'))
您可能希望将关键字AUTOINCREMENT
添加到id
列;默认是选择最高的现有行ID加1,如果您定期从表中删除可能导致重用ID的数据(删除当前最高ID并且下次将重复使用) 。 AUTOINCREMENT
保证每个生成的数字仅对表使用一次,与删除无关。
请注意,当您使用{{3}}(使用with
声明)时,会自动为您应用commit()
。引用文档:
连接对象可以用作自动提交或回滚事务的上下文管理器。如果发生异常,则回滚事务;否则,交易已经提交。
换句话说,您可以安全地删除代码中的conn.commit()
行,这完全是多余的。