如何检查表中是否存在列,如果不存在则不插入列

时间:2015-07-31 21:35:38

标签: python postgresql psycopg2

我试图让程序在尝试将值插入不存在的列时不会崩溃(首先发生这种情况的原因是因为它插入的列名来自值红色在另一个可能包含拼写错误的表中。)

如果列不存在,我该如何跳过INSERT

for row in cur2:
            if row[1] > specialLimit:
               try:
                 cur.execute("INSERT INTO {}.{} (item_id) VALUES ('{}')".format(schema, table, row[0]))
                 con.commit()
               except psycopg2.DatabaseError as e:
                 print('Error: '+e)

这仍然会出错:

LINE 1: INSERT INTO load_primary.item_properties (exotic) VALUES (...

2 个答案:

答案 0 :(得分:7)

您可以在提出请求之前运行简单查询:

select exists (
  select 1 from information_schema.columns 
  where table_name ='my_table' 
  and column_name='my_column'
);

这将返回布尔值,psycopg2将自动将其转换为python' s布尔值。

另一种方法是运行单个查询以立即检查所有列。并仅将数据插入到存在的数据中。这可能稍微高效一点。

答案 1 :(得分:1)

最pythonic方法是不要求权限 - 在try/except块中执行插入;检查异常以了解引发的异常;如果它是一个缺失的列,请跳过该插入,记录错误或您需要做的任何事情。