2013-10-23 25 views
0

我有一个更新脚本,它接受一些参数,其中一个参数是主键的元组,用于标识正确的行。但是,我不检查以确保密钥在我的代码中是主要的,我想。我不想让任何人执行脚本。如果我必须运行一个额外的查询,这很好,我只想在代码中向前移动之前检查此元组中的每个键都是主键。谢谢!如何检查密钥是否为主psycopg2

编辑:(增加一些清晰度)。所以,想象一下,我有一个脚本,它包含一个表名和一个键列表。我想检查这些键中的每一个在给定表中都是主要的。

+0

问题是对我来说还不够清楚,但看起来像你可以使用系统目录来获得你需要的信息 - http://www.postgresql.org/docs/current/static/catalogs.html –

回答

1

找出一个表,应在任何SQL数据库工作的主键列的一般方法是这样的:

SELECT column_name 
FROM information_schema.table_constraints 
    JOIN information_schema.key_column_usage 
     USING (constraint_catalog, constraint_schema, constraint_name, 
       table_catalog, table_schema, table_name) 
WHERE constraint_type = 'PRIMARY KEY' 
    AND (table_schema, table_name) = ('yourschema', 'yourtable') 
ORDER BY ordinal_position; 

返回类似

┌─────────────┐ 
│ column_name │ 
├─────────────┤ 
│ a   │ 
│ b   │ 
└─────────────┘ 
+0

我试过了,但它只是返回一个空的结果列表,这是在psql中的工作? –

+0

是的,它应该适用于所有客户。 –

2

嗯,我找到了一个答案,也许不是最好的。我正在寻找某种函数/查询,它将返回一个布尔值,指示该密钥是否为primary_key。这样,我返回一个主键列表并检查我的键是否在该列表中。

一些代码:

sql = "select indexdef from pg_indexes where tablename = '%s';" % (table,) 
self.cursor.execute(sql) 
rows = self.cursor.fetchall() 
row = rows[0][0] 

从那里,你可以在您认为合适削减了结果字符串。我基本上只是剥去了无用的文本,直到我用逗号分隔主键,并在其上做了一个string.split(“,”)。然后,你可以检查。

相关问题