【问题标题】:Postgres existing column doesn't exist errorPostgres 现有列不存在错误
【发布时间】: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_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 复制列名时,它可以工作。但是当我自己输入该列的名称时,它不起作用。这取决于什么 - 我不知道。

【问题讨论】:

  • 你需要展示你的sql.Identifier函数。
  • @DanielRoseman sql.Identifier 来自psycopg2.sql 库的类,用于格式化查询中的列表元素。这不是我自己的。
  • 这个问题是关于什么的?我意识到你的问题随着时间的推移而改变了..
  • @Mox 现在我只有一个问题:如何每次都能完成这项工作?不仅在 Postgres 需要时
  • 我建议你更新你的问题标题/内容以反映你真正的要求

标签: python postgresql psycopg2


【解决方案1】:

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

已通过更改列名修复。

【讨论】:

    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2021-10-22
    • 2018-09-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多