使用Sqlalchemy连接和Postgres从原始字符串编译查询(不使用.text(…))

2024-04-25 01:06:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用SQLAlchemy1.3连接到PostgreSQL9.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'

我见过很多例子使用^{}生成一个语句,然后得到一个编译版本。多亏了this onethis one等其他答案,当我有一个SqlAlchemy查询时,我能够生成一个像样的str。你知道吗

但是,在这个特殊的例子中,因为我使用的是更为特定于游标的语法%(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)

但我没能得到。你知道吗


Tags: fromselfidfoo语法thisconnwhere
2条回答

好吧,我想我明白了。你知道吗

SqlAlchemy的^{}+Psycopg的^{}的组合似乎就是答案。你知道吗

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()

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

不知道这是不是你想要的,但这是你想要的。你知道吗

假设语句\u 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"

相关问题 更多 >