Python 在psycopg2中传递参数

Python 在psycopg2中传递参数,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我正在尝试使用psycopg2访问PostgreSQL: sql = """ SELECT %s FROM table; """ cur = con.cursor() input = (['id', 'name'], ) cur.execute(sql, input) data = pd.DataFrame.from_records(cur.fetchall()) 但是,返回的结果是: 0 0 [id, name] 1 [id, name]

我正在尝试使用psycopg2访问PostgreSQL:

sql = """
SELECT
    %s
FROM
    table;
"""

cur = con.cursor()
input = (['id', 'name'], )
cur.execute(sql, input)

data = pd.DataFrame.from_records(cur.fetchall())
但是,返回的结果是:

             0
0   [id, name]
1   [id, name]
2   [id, name]
3   [id, name]
4   [id, name]
如果我尝试访问单个列,它看起来像:

     0
0   id
1   id
2   id
3   id
4   id
在列名周围加引号似乎有问题(不应该有单引号):

但我在关注博士:

谁能告诉我这里发生了什么?非常感谢

使用AsIs扩展

import psycopg2
from psycopg2.extensions import AsIs

column_list = ['id','name']
columns = ', '.join(column_list)

cursor.execute("SELECT %s FROM table", (AsIs(columns),))

mogrify将显示它没有引用列名并按原样传递它们。

原因是您将数组['id','name']的字符串表示形式作为SQL查询参数传递,而不是作为列名传递。因此,生成的查询类似于

SELECT 'id, name' FROM table
看起来您的表有5行,所以返回的结果就是每行的这个文本

列名不能是SQL查询参数,而只能是通常的字符串参数,您可以在执行查询之前准备这些参数-

sql = """
SELECT
    %s
FROM
    table;
"""

input = 'id, name'
sql = sql % input
print(sql)

cur = con.cursor()
cur.execute(sql)

data = pd.DataFrame.from_records(cur.fetchall())
在这种情况下,生成的查询是

SELECT
    id, name
FROM
    table;
现在,您可以使用以下方法以干净、安全的方式完成此操作:

从psycopg2导入sql
声明=”“”
挑选
{id},{name}
从…起
桌子
"""
将con.cursor()作为cur:
cur.execute(sql.sql(语句).format(
id=sql.sql.Identifier(“id”),
name=sql.sql.Identifier(“名称”)
))
data=pd.DataFrame.from_记录(cur.fetchall())
有关查询组合的更多信息,请参见此处:

SELECT
    id, name
FROM
    table;