1

プログラミングの典型的な問題のようですが、グーグルでは何も役に立ちませんでした。これはコードです:

file=open('list.txt','r')
    for line in file:
        cursor.execute("CREATE TABLE IF NOT EXISTS \
        %s(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, \
        entry TEXT NOT NULL)" % line)
    file.close()
    cursor.close()
    db.close()

そして、これは一重引用符でテーブルを作成しようとしたときのエラーです:

Traceback (most recent call last):
  File "test.py", line 104, in <module>
    entry TEXT NOT NULL)" % line)
  File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 166, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/pymodules/python2.7/MySQLdb/connections.py", line 35, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Hi 'Buddy!(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT,         entry ' at line 1")

MySQLdb.escape_string(line)ところで直さないで

4

5 に答える 5

1

afaik ( MySQL 5.0 Reference hereを参照) テーブル名に一重引用符を使用することはできません。

引用符なしの識別子で使用できる文字:

ASCII: [0-9,a-z,A-Z$_] (basic Latin letters, digits 0-9, dollar, underscore)
Extended: U+0080 .. U+FFFF
于 2011-07-22T16:33:36.963 に答える
0

これを試して -

cursor.execute("CREATE TABLE IF NOT EXISTS '%s'(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, entry TEXT NOT NULL)" % line)
于 2011-07-22T16:33:27.437 に答える
0

% フォーマットを使用して値を挿入する代わりに、置換する必要がある各値に対してステートメントをそのまま渡して、すべての置換値のリストまたはタプルを 2 番目の引数として渡します。次に例を示しますcursor.execute()%s

stmt = "CREATE TABLE IF NOT EXISTS %s(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, entry TEXT NOT NULL)"
value_list = [line]
cursor.execute(stmt, value_list)

これにより、文字列が有効な SQL リテラルに変換されるため、必要なすべてのエスケープが実行されます。これは、MySQLdb User's Guideから直接引用したものです。関連する例を次に示します。

クエリを実行するには、まずカーソルが必要です。次に、カーソルに対してクエリを実行できます。

c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

この例では、 max_price=5 では、なぜ文字列で %s を使用するのでしょうか? MySQLdb はそれを文字列 '5' である SQL リテラル値に変換するためです。完了すると、クエリは実際には「...WHERE price < 5」となります。

于 2011-07-22T16:33:41.307 に答える
0

一般に、このようにプログラムでテーブル名を作成しようとしている場合は、別のスキーマを使用する方がうまくいきます。このようなテーブルを 1 つ作成し、現在テーブル名に使用している文字列を含む列を追加することをお勧めします。

于 2011-07-22T17:02:42.363 に答える
0

なぜそうしているのかわかりません。スキーマを再考することをお勧めしますが、バッククォートでテーブル名をエスケープできます`

# notice the `'s surrounding %s
for line in file:
    cursor.execute("CREATE TABLE IF NOT EXISTS \
    `%s`(id INT(2) NOT NULL PRIMARY KEY AUTO_INCREMENT, \
    entry TEXT NOT NULL)" % line)
于 2011-07-22T16:32:33.313 に答える