1

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

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数据到表中。表具有作为主要整数值。这必须在每次插入时增加 - 正确的方法是什么?我是否必须获取每一行并检查每个请求的最后一行是什么?SurveysSurveysIdId

4

1 回答 1

2

sqlite如果您自己不提供值,将自动为表上 INSERT 上的 INTEGER PRIMARY KEY 列提供 id 。只需为除该列之外的每一列插入数据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保证每个生成的数字只会用于表一次,与删除无关。

请注意,当您将连接sqlite3用作上下文管理器(使用with语句)时,commit()会自动为您应用。引用文档:

连接对象可以用作自动提交或回滚事务的上下文管理器。如果发生异常,事务回滚;否则,事务被提交。

换句话说,您可以安全地删除代码中的conn.commit()行,它完全是多余的。

于 2013-01-27T11:08:31.410 回答