1

当我尝试将 %s 语法与 sqlalchemy 和 sqlite 一起使用时,出现错误。与 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%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(我假设其他服务器也是如此),因此您可以编写一次并针对不同的数据库服务器使用它(当然,只要您保持 sql 通用)。

于 2012-12-06T04:48:08.250 回答
0

我通过使用问号语法解决了这个问题:

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

这适用于 sqlite和 postgres

来自Pylon 书中关于 sqlalchemy 的章节

不同的数据库使用不同的标记(称为参数样式)来标记您传递给 execute() 的变量应该插入的位置。上面的例子使用了 SQLite,它使用 ? 作为参数样式,但如果您尝试使用 MySQL 或 PostgreSQL,则需要使用 %s 作为参数样式。然后 SQL 看起来像这样

正确的答案是用户 sqlalchemy “文本”(请参阅​​我的其他答案)。

于 2012-12-05T08:10:42.497 回答