gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:18:41 27 4
gpt4 key购买 nike

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

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com