当前位置: 首页 > 知识库问答 >
问题:

列不存在(SQLAlchemy/PostgreSQL):引号有问题

锺离自明
2023-03-14

我在使用SQLAlchemy进行postgresql查询时遇到问题。

我用这行代码创建了一些大表:

frame.to_sql('Table1', con=engine, method='multi', if_exists='append')

它工作得很好。现在,当我想查询数据时,我的第一个问题是我必须为每个表和列名称使用引号,我真的不知道为什么,也许有人可以帮我。

但这不是我的主要问题。我的主要问题是,在查询数据时,所有数值条件都可以正常工作,但列数据中带有字符串的条件除外。我得到一个错误,该列不存在。即时通讯使用:

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,如果有人能给我指明正确的方向,我将非常感激。

共有2个答案

乌杰
2023-03-14

它应该是:和“variable2”=“abc”

不能使用,因为PostgreSQL会将其解释为数据库对象。顺便说一句,除非非常必要,否则不需要将表名和列用双引号括起来,例如区分大小写的对象名、包含空格的名称等。从长远来看,这是一种不好的做法,只会导致混淆。因此,您的查询可以完美地编写如下:

SELECT variable1, variable2 
FROM table1 
WHERE variable1 = 123 AND variable2 = 'abc';

请记住,它也适用于其他对象,如表或索引。

  • 创建表Table1(id int)-很好

如果您想从表名中删除不必要的双引号:

ALTER TABLE "Table1" RENAME TO table1;

演示:db

应涵容
2023-03-14

“大多数”SQL方言(值得注意的例外是MS SQL Server和MS Access)严格区分

  • 单引号:用于字符串文本,例如,WHERE thing='foo'

PostgreSQL增加了一个缺点,即如果表/列名没有(双)引号,则必须使用小写,然后使用区分大小写的匹配,因此如果表名为Table1

  • SELECT*FROM table 1将失败,因为PostgreSQL将查找table 1,但是
  • 从“表1”中选择*将成功

避免查询混乱的方法是使用查询参数而不是字符串文字:

# 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
"""

 类似资料:
  • 我试图导入200 SAS XPT文件到我的PostgreSQL数据库: 但是,生成的SQL对所有标识符都有双引号,例如:.问题是,如果列/表/模式是用引号创建的,每次我需要查询它们时,我必须包括引号,同时使用精确的大小写。 我想去掉引号,但我自己无法编写自定义SQL,因为这些文件的结构都非常不同。

  • 我有一个表,它有20个整数列和一个名为“foo”的文本列 如果我运行查询: 我得到一个错误: 我已经核实过他的专栏确实存在。如果我这样做: 结果输出将“foo”显示为一列。。。。我猜我必须在查询中做一些特殊的事情,因为foo是一个文本列。。。 感谢您的帮助(POSTGRESQL 8.3)

  • 我正在运行一个简单的select查询: 并得到以下错误: 错误:列return_part_i.cntrctrmntnind不存在第1行:从return_part_i.cntrctrmntnind中选择return_part_i.cntrctrmntnind…^提示:也许你想引用“return_part_i.cntrctrmntnind”一栏。SQL状态:42703字符:8 我尝试了使用和不使用表标

  • 我正在编写一个应用程序来自动构建和运行SQL查询。对于许多表,我的代码工作正常,但在某个表上,它会抛出以下异常: 已运行的查询如下所示: 这实际上是从列中返回非空值。 我不明白为什么在pgAdmin 4中出现“列不存在”错误。我可以看到有一个名为的模式,其中包含表,该表有一个名为的列。 既然所有的列、模式和表名都是由应用程序本身检索的,我不认为存在拼写或语义错误,那么为什么PostgreSQL会导

  • 这表明Docker postgresql(正在运行)在该端口不可用。我尝试将添加到我的中,但没有成功。有什么提示吗?

  • 与其在文本中转义每个,有没有办法一次转义它们,就像这样: