0

私は自分の脳をPHP+MySQLからPythonに移行している最中であり、現在、sqliteが組み込まれているため、後で他の何かへの仲介として使用しています。

使用する初期データベースを設定しようとすると、複数の行を持つINSERTステートメントでエラーがスローされます。INSERT

import sqlite3

query = """CREATE TABLE IF NOT EXISTS "users" (
             "userID" INTEGER PRIMARY KEY autoincrement,
             "email" varchar(255) NOT NULL,
             "forename" varchar(50) NOT NULL,
             "surname" varchar(50) NOT NULL
           );
           INSERT INTO "users" ("userID", "email", "forename", "surname") 
           VALUES
             (1, 'user1@example.com', 'Test', 'User'),
             (2, 'user2@example.com', 'Test', 'User');"""

 db_conn = sqlite3.connect('test.db')
 try:
     db_conn.cursor().executescript(query)
     db_conn.commit()
 except:
     print "error with database"
     raise
 finally:
     db_conn.close()

実行すると、次のようになります。

error with database
Traceback (most recent call last):
  File "dbTest.py", line 20, in <module>
    db_conn.cursor().executescript(query)
sqlite2.OperationalError: near ",": syntax error

どの「、」が気に入らなかったかを正確に見つけるのにかなりの時間がかかりました(つまり、本当に?SQLエラーは最悪です!)。それは確かに「、」INSERT行を区切ることです。

私はどんな愚かなことをしましたか?

4

1 に答える 1

1

挿入には、可能であれば、実行スクリプトの代わりに.executemany()を使用します。そうでなければ、あなたがそれを渡すことができないならば、あなたの声明はあなたがそれを渡したいセットINSERTごとに別々である必要があるでしょう。VALUES

query = """INSERT INTO "users" ("userID", "email", "forename", "surname") 
           VALUES
           (?, ?, ?, ?)
        """
user_list = ((1, 'user1@example.com', 'Test', 'User'), (2, 'user2@example.com', 'Test', 'User'))
cursor.executemany("INSERT INTO myTable(data) values (?) ", user_list)

編集:この投稿によると、実際には1つのステートメントに複数の値セットを含めることができますINSERTが、構文はかなりきれいではありません。

于 2012-05-17T10:29:39.443 に答える