python - 列不存在 (SQLAlchemy/PostgreSQL) : Trouble with quotation marks

标签 python sql pandas postgresql sqlalchemy

我在使用 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/

相关文章:

python - 在 pandas 数据框中添加字符串 url

python - Pandas:合并两个数据框列

python - extract 如何从 pdf 文件中提取特定文本 - python

mysql - 如何计算表中字符串值按行出现的次数

sql - 如何合并和显示来自多个表的数据

sql - oracle join中如何根据列值仅获取一条记录

python - 如何使用 Python 从 HTML 获取 href 链接?

python - Django admin - 覆盖已经注册的模型

python - 将 Regex 与 Python 结合使用来获取 iframe src 的特定部分

python - 使用 pandas 将字符串转换为日期时间值