【发布时间】:2021-10-08 15:27:30
【问题描述】:
我在使用 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 新手,如果有人能指出我正确的方向,我将不胜感激。
【问题讨论】:
-
应该是:
AND "variable2" = 'abc'。顺便说一句,您不能用"引用字符串。除非非常必要,否则您不需要用双引号将表名和列括起来。恕我直言,这是一种不好的做法,只会导致混乱。这也有效:SELECT variable1, variable2 FROM Table1 WHERE variable1 = 123 AND variable2 = 'abc' -
我猜这就是问题所在。但是,当我使用“abc”时,引号会取消参数中的引号,并且会出现语法错误。当我不对表和列使用双引号时,它不起作用 - “列不存在”。也许是我奇怪地创造了它们。
-
你不能用
"包装整个sql 语句,例如"SELECT variable1, variable2 FROM Table1 WHERE variable1 = 123 AND variable2 = 'abc'"? -
然后取消表和列名的双引号。如果我把它们排除在外,我会得到“列不存在”错误。我认为这与我如何创建表格有关?对于其他表,我不需要双引号
-
是的,这可能是问题所在!您是否创建了这样的表
create table "table1" (...?我真的不鼓励对数据库对象使用双引号。它真的很讨厌,您可能会浪费很多时间来查找问题。
标签: python sql pandas postgresql sqlalchemy