将带索引的行添加到sqlite中的正确方法是什么?

时间:2013-01-27 11:07:21

标签: python sqlite

我通过以下查询创建了一个表:

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是什么?

1 个答案:

答案 0 :(得分:2)

如果您没有自己提供值,

sqliteautomatically 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()行,这完全是多余的。