0

我正在使用 Sqlalchemy 1.3 连接到 PostgreSQL 9.6 数据库(通过 Psycopg)。

我有一个非常非常原始的 Sql 字符串,它使用Psycopg2语法格式化,由于一些遗留问题,我无法修改:

statement_str = SELECT * FROM users WHERE user_id=%(user_id)s

注意%(user_id)s

我可以很高兴地使用 sqlalchemy 连接执行它,只需执行以下操作:

connection = sqlalch_engine.connect()
rows = conn.execute(statement_str, user_id=self.user_id)

它工作正常。我得到了我的用户,一切都很好。

现在,出于调试目的,我希望将%(user_id)s参数扩展为实际值的实际查询。例如:如果user_id = "foo",则得到SELECT * FROM users WHERE user_id = 'foo'

我已经看到大量sqlalchemy.text(...)用于生成语句然后获得编译版本的示例。多亏了其他答案,比如这个这个str,当我有一个 SqlAlchemy 查询时,我能够产生一个像样的答案。

但是,在这种特殊情况下,由于我使用的是更特定于游标的语法,%(user_id)所以我不能这样做。如果我尝试:

text(statement_str).bindparams(user_id="foo")

我得到: This text() construct doesn't define a bound parameter named 'user_id'

所以我想我正在寻找的是

conn.compile(statement_str, user_id=self.user_id)

但我无法得到那个。

4

2 回答 2

1

好的,我我明白了。

SqlAlchemy's raw_connection+ Psycopg's的组合mogrify似乎就是答案。

conn = sqlalch_engine.raw_connection()
try:
    cursor = conn.cursor()
    s_str = cursor.mogrify(statement_str, {'user_id': self.user_id})
    s_str = s_str.decode("utf-8")  # mogrify returns bytes

    # Some cleanup for niceness:
    s_str = s_str.replace('\n', ' ')
    s_str = re.sub(r'\s{2,}', ' ', s_str)
finally:
    conn.close()

我希望其他人觉得这有帮助

于 2019-05-23T16:19:09.180 回答
1

不确定这是否是您想要的,但这里有。

假设 statement_str 实际上是一个字符串:

import sqlalchemy as sa

statement_str = "SELECT * FROM users WHERE user_id=%(user_id)s"
params = {'user_id': 'foo'}

query_text = sa.text(statement_str % params)

# str(query_text) should print "select * from users where user_id=foo"
于 2019-05-23T16:20:06.473 回答