Postgres现有列不存在错误

时间:2019-08-17 18:50:31

标签: python postgresql psycopg2

我在发送数据库查询时遇到下一个麻烦

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_namesquery字段,它在其他类中效果很好。

    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复制列名时,它可以工作。但是,当我自己输入该列的名称时,它不起作用。它取决于什么-我不知道。

1 个答案:

答案 0 :(得分:0)

结果,发现第二个开发人员在创建表时在列c上写了西里尔字母crossroad_id而不是拉丁文...

通过更改列名来固定。