使用 Sqlalchemy 连接和 Postgres 从原始字符串编译查询(不使用 .text(...))
Compile query from raw string (without using .text(...)) using Sqlalchemy connection and Postgres
我正在使用 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 查询时,我已经看到大量使用 sqlalchemy.text(...)
to produce a statement and then get a compiled version. I have that thanks to other answers like this one or this one 能够产生像样的 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)
但是我没能得到。
好的我想我明白了。
SqlAlchemy 的组合 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()
我希望对其他人有所帮助
不确定这是否是您想要的,但这里是。
假设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"
我正在使用 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 查询时,我已经看到大量使用 sqlalchemy.text(...)
to produce a statement and then get a compiled version. I have that thanks to other answers like this one or this one 能够产生像样的 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)
但是我没能得到。
好的我想我明白了。
SqlAlchemy 的组合 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()
我希望对其他人有所帮助
不确定这是否是您想要的,但这里是。
假设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"