我在使用 SQLAlchemy 进行 postgresql 查询时遇到问题。
我使用这行代码创建了一些大表:
frame.to_sql('Table1', con=engine, method='multi', if_exists='append')
效果很好。现在,当我想从中查询数据时,我的第一个问题是我必须为每个表和列名使用引号,我真的不知道为什么,也许有人可以帮助我。
但这不是我的主要问题。我的主要问题是,在查询数据时,所有数字 WHERE 条件都可以正常工作,但列数据中带有字符串的条件则不行。我收到一个错误,该列不存在。我正在使用:
df = pd.read_sql_query('SELECT "variable1", "variable2" FROM "Table1" WHERE "variable1" = 123 AND "variable2" = "abc" ', engine)
我认为我使用“abc”而不是“abc”可能是一个问题,但由于查询参数中的“符号”,我无法更改它。如果我将这些 ' 更改为 ",则无法正确检测到列名称和表名称(因为之前的问题,它们必须用引号引起来)。
这是错误消息:
ProgrammingError: (psycopg2.errors.UndefinedColumn) ERROR: COLUMN »abc« does not exist
LINE 1: ...er" FROM "Table1" WHERE "variable2" = "abc"
And there is an arrow pointing to the first quotation mark of the "abc".
我是 SQL 新手,如果有人能为我指明正确的方向,我将不胜感激。
最佳答案
“大多数”SQL 方言(值得注意的异常(exception)是 MS SQL Server 和 MS Access)严格区分
- 单引号:用于字符串文字,例如
WHERE thing = 'foo'
- 双引号:用于对象(表、列)名称,例如
WHERE "some col"= 123
PostgreSQL 带来了一个额外的问题,即表/列名称如果没有(双)引号,则被强制为小写,然后使用区分大小写的匹配,因此如果您的表名为 Table1
那么
SELECT * FROM Table1
将失败,因为 PostgreSQL 将查找table1
,但是SELECT * FROM "Table1"
将成功。
避免查询困惑的方法是使用查询参数而不是字符串文字:
# set up test environment
with engine.begin() as conn:
conn.exec_driver_sql('DROP TABLE IF EXISTS "Table1"')
conn.exec_driver_sql('CREATE TABLE "Table1" (variable1 int, variable2 varchar(50))')
df1 = pd.DataFrame([(123, "abc"), (456, "def")], columns=["variable1", "variable2"])
df1.to_sql("Table1", engine, index=False, if_exists="append")
# test .read_sql_query() with parameters
import sqlalchemy as sa
sql = sa.text('SELECT * FROM "Table1" WHERE variable1 = :v1 AND variable2 = :v2')
param_dict = {"v1": 123, "v2": "abc"}
df2 = pd.read_sql_query(sql, engine, params=param_dict)
print(df2)
"""
variable1 variable2
0 123 abc
"""
关于python - 列不存在 (SQLAlchemy/PostgreSQL) : Trouble with quotation marks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68635773/