Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Sqlalchemy连接和Postgres从原始字符串编译查询(不使用.text(…))_Python_Postgresql_Sqlalchemy_Psycopg2_Parameter Expansion - Fatal编程技术网

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

Python 使用Sqlalchemy连接和Postgres从原始字符串编译查询(不使用.text(…)),python,postgresql,sqlalchemy,psycopg2,parameter-expansion,Python,Postgresql,Sqlalchemy,Psycopg2,Parameter Expansion,我正在使用Sqlalchemy 1.3连接到PostgreSQL 9.6数据库(通过Psycopg) 我有一个非常原始的Sql字符串,使用语法格式化,由于一些遗留问题,我无法修改该字符串: statement\u str=SELECT*FROM user其中user\u id=%(user\u id)s 注意%(用户id)s 通过使用sqlalchemy连接,我可以很高兴地执行以下操作: connection = sqlalch_engine.connect() rows = conn.exec

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

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

statement\u str=SELECT*FROM user其中user\u id=%(user\u id)s

注意
%(用户id)s

通过使用sqlalchemy连接,我可以很高兴地执行以下操作:

connection = sqlalch_engine.connect()
rows = conn.execute(statement_str, user_id=self.user_id)
而且效果很好。我得到了我的用户,一切都很好

现在,出于调试的目的,我想用
%(user_id)s
参数将实际查询扩展为实际值。例如:如果
user\u id=“foo”
,则从user\u id='foo'

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

然而,在这个特殊的例子中,由于我使用的是更为特定于光标的语法
%(user\u id)
,所以我不能这样做。如果我尝试:

text(statement\u str).bindparams(user\u id=“foo”)

我得到:
此text()构造未定义名为“user\u id”的绑定参数。

所以我想我要找的是

conn.compile(statement_str, user_id=self.user_id)
但是我没能得到它。

好的,我想我得到了

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()
我希望其他人会觉得这很有帮助

好吧,我想我明白了

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"

不确定这是否是你想要的,但现在开始

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

谢谢你的回答。问题是
文本(…)
试图将
%(用户id)转义为
%(用户id)
之类的内容。很高兴你找到了解决方案。谢谢你的回答。问题是
文本(…)
试图将
%(用户id)转义为
%(用户id)
之类的内容。很高兴你找到了解决办法。