1

sqlalchemy および sqlite で %s 構文を使用しようとすると、エラーが発生します。postgresql と同じ構文で問題なく動作します。

import sqlalchemy
e = sqlalchemy.create_engine('sqlite:////tmp/x.db?timeout=120000')
e.execute('select * from people where name = %s;', 'joe').fetchall()

私はこれを得る:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1396, in _cursor_execute
    context)
  File "/usr/lib/python3/dist-packages/sqlalchemy/engine/default.py", line 301, in do_execute
    cursor.execute(statement, parameters)
sqlite3.OperationalError: near "%": syntax error

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1790, in execute
    return connection.execute(statement, *multiparams, **params)
  File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1191, in execute
    params)
  File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1287, in _execute_text
    return self.__execute_context(context)
  File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1302, in __execute_context
    context.parameters[0], context=context)
  File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1403, in _cursor_execute
    context)
  File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1360, in _handle_dbapi_exception
    from e
sqlalchemy.exc.OperationalError: (OperationalError) near "%": syntax error 'select * from people where name = %s;' ('joe',)
>>> 

繰り返しますが、postgres とまったく同じことがリストまたは行を返します。これはバグですか?それとも期待されていますか?

4

3 に答える 3

3

文字列の書式設定に小さな問題があります'select * from people where name = %s;', 'joe'

%s文字列の書式設定に使用され、文字列の後に%s% が必要ですsome sort Data to be replaced

,fromを削除して、 get%s;', 'joe'に a を追加する必要があります%

In [10]: 'select * from people where name = %s;' %'joe'
Out[10]: 'select * from people where name = joe;'
于 2012-12-05T05:28:04.860 に答える
0

正しい答えは、私の別の投稿に対する彼の答えでヴァンによって与えられます。解決策は、 sqlalchemy "text"を使用することです。これは SQLite と postgreSQL の両方で機能するため (他のサーバーも想定しています)、一度記述して異なる DB サーバーに対して使用することができます (もちろん、SQL を一般的なものにしておく限り)。

于 2012-12-06T04:48:08.250 に答える
0

疑問符の構文を使用して回避しました。

e.execute('select * from people where name = ?;', 'joe').fetchall()

これは sqliteと postgresの両方で機能します。

パイロンの本のsqlalchemyに関する章から:

データベースが異なれば、異なるマーカー (param スタイルと呼ばれる) を使用して、execute() に渡す変数を挿入する場所にラベルを付けます。上記の例では、? を使用する SQLite を使用しました。ただし、MySQL または PostgreSQL を使用しようとした場合は、代わりに %s を param スタイルとして使用する必要があります。SQLは次のようになります

正しい答えは、ユーザー sqlalchemy "text" です (私の他の答えを参照してください)。

于 2012-12-05T08:10:42.497 に答える