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生成された各数値が、削除とは関係なく、テーブルに対して 1 回だけ使用されることを保証します。

接続をコンテキスト マネージャーとして(ステートメントを使用して) 使用すると、sqlite3自動的に適用されることに注意してください。ドキュメントの引用:withcommit()

接続オブジェクトは、トランザクションを自動的にコミットまたはロールバックするコンテキスト マネージャーとして使用できます。例外が発生した場合、トランザクションはロールバックされます。それ以外の場合、トランザクションはコミットされます。

つまり、コード内の行を安全に削除できconn.commit()ます。これは完全に冗長です。

于 2013-01-27T11:08:31.410 に答える