Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查表中是否存在列,如果不存在,如何不插入列';T_Python_Postgresql_Psycopg2 - Fatal编程技术网

Python 如何检查表中是否存在列,如果不存在,如何不插入列';T

Python 如何检查表中是否存在列,如果不存在,如何不插入列';T,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我试图使一个程序在试图将一个值插入一个不存在的列时不会崩溃(发生这种情况的原因首先是因为它插入的列名来自另一个表中可能包含拼写错误的红色值) 如果列不存在,如何跳过插入的 for row in cur2: if row[1] > specialLimit: try: cur.execute("INSERT INTO {}.{} (item_id) VALUES ('{}')".format(schema

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

如果列不存在,如何跳过插入的

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)
这仍然会产生错误:


第1行:在load\u primary.item\u属性(外来)值中插入(…

您可以在发出请求之前运行一个简单的查询:

select exists (
  select 1 from information_schema.columns 
  where table_name ='my_table' 
  and column_name='my_column'
);
这将返回布尔值,
psycopg2
将自动将其转换为python的布尔值


另一种方法是运行单个查询,一次检查所有列。并仅向存在的列插入数据。这种方法效率略高。

最常用的方法是不请求权限——在
try/except
块中执行insert;检查异常以了解引发了什么异常;如果缺少列,则跳过该插入、记录错误或您需要执行的任何操作。

它如何知道在哪个架构中查找指定的表?我正在使用的数据库在不同的架构中有多个同名的表。您可以使用
table_schema
列缩小搜索范围这类似于检查文件在创建或打开之前存在(即“错误”)因为这会导致可能的竞争条件:列可以在检查步骤和插入步骤之间更改。不要请求权限,只需这样做即可。@ChrisJohnson对于数据库这样的事务性系统来说,情况不一定如此。错误处理可能比预检查昂贵得多,需要使用subtransactions等。您还可以使用锁定功能使此类预检查更安全。例如,如果您
以行独占模式锁定表my_schema.my_TABLE
,则您可以安全地测试其结构,知道在提交或回滚之前没有其他人可以更改它。此外,您提倡的方法会产生大量错误日志噪音数据库。这就是我试图做的,但我似乎没有捕捉到正确的错误,例如psycopg2.DatabaseError检查返回的异常是什么,例如,如果您命名异常参数
exc
,只需在
块中输入
print exc,键入(exc)