postgresql 在psycopg2中传递参数

2cmtqfgy  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(3)|浏览(134)

我正在尝试使用psycopg 2访问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


看起来列名周围的引号有问题(不应该有单引号):

In [49]: print cur.mogrify(sql, input)

SELECT
    'id'
FROM
    table;


但我在跟踪dochttp://initd.org/psycopg/docs/usage.html#
有人能告诉我这是怎么回事吗?多谢了!!!

ddhy6vgd

ddhy6vgd1#

使用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将显示它没有引用列名并按原样传递它们。

ddhy6vgd

ddhy6vgd2#

现在,您可以使用sql.Identifier以一种干净安全的方式来完成此操作:

from psycopg2 import sql

statement = """
SELECT
    {id}, {name}
FROM
    table;
"""

with con.cursor() as cur:
  cur.execute(sql.SQL(statement).format(
    id=sql.Identifier("id"),
    name=sql.Identifier("name")
  ))

  data = pd.DataFrame.from_records(cur.fetchall())

字符串
有关查询组合的更多信息,请参见:https://www.psycopg.org/docs/sql.html

zdwk9cvp

zdwk9cvp3#

原因是您将数组的字符串表示['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;

相关问题