【发布时间】:2019-08-17 18:50:31
【问题描述】:
我在发送数据库查询时遇到了下一个问题
psycopg2.errors.UndefinedColumn: column "crossroad_id" of relation "api_accidents" does not exist
LINE 1: INSERT INTO api_accidents ("crossroad_id", "datetime_start",...
反复思考,发现错误是由于引号引起的。
我有一个用于数据库查询的基类和一些子类,它们对不同的表进行查询。其他儿童班的工作不会中断。下面列出了向数据库发送查询的函数。
def send(self, args):
query = sql.SQL(self.query).format(
sql.SQL(', ').join(map(sql.Identifier, self.col_names)),
sql.SQL(', ').join(map(sql.Placeholder, self.col_names))
)
self.cursor.execute(query, args)
在子方法中,我只更改字段col_names 和query,它在其他类中也能完美运行。
query = """INSERT INTO api_accidents ({}) VALUES ({})"""
col_names = ['crossroad_id', 'datetime_start', 'datetime_stop']
这里是这样的原始查询工作
INSERT INTO api_accidents (сrossroad_id, datetime_start, datetime_stop)
VALUES (1, current_timestamp, NULL)
这个不行
INSERT INTO api_accidents ("сrossroad_id", "datetime_start", "datetime_stop")
VALUES (1, current_timestamp, NULL)
但标准的sql.SQL 格式会进行第二次查询。
在查询中不手动写列名是否可以解决这个问题?
更新
我再次检查它,发现它不依赖于引号。无论有无引号,此查询都有效:
INSERT INTO api_accidents (сrossroad_id, datetime_start, datetime_stop)
VALUES (1, current_timestamp, NULL);
而这个根本不起作用:
INSERT INTO api_accidents (crossroad_id, datetime_start, datetime_stop)
VALUES (1, current_timestamp, NULL);
是的,它们完全一样。但 Postgres 不这么认为。
更新 2
最后我发现,当我从information_schema.columns 复制列名时,它可以工作。但是当我自己输入该列的名称时,它不起作用。这取决于什么 - 我不知道。
【问题讨论】:
-
你需要展示你的
sql.Identifier函数。 -
@DanielRoseman
sql.Identifier来自psycopg2.sql库的类,用于格式化查询中的列表元素。这不是我自己的。 -
这个问题是关于什么的?我意识到你的问题随着时间的推移而改变了..
-
@Mox 现在我只有一个问题:如何每次都能完成这项工作?不仅在 Postgres 需要时
-
我建议你更新你的问题标题/内容以反映你真正的要求
标签: python postgresql psycopg2