我有一个更新脚本,它接受一些参数,其中一个是用于识别正确行的主键元组。但是,我不检查以确保密钥在我的代码中是主要的,我愿意这样做。我不想把它留给实现脚本的人。如果我必须运行一个额外的查询也没关系,我只想在代码中前进之前检查这个元组中的每个键是否都是主键。谢谢!
编辑:(增加一些清晰度)。所以,想象一下我有一个脚本,它接受一个表名和一个键列表。我想检查这些键中的每一个是否都是给定表中的主键。
我有一个更新脚本,它接受一些参数,其中一个是用于识别正确行的主键元组。但是,我不检查以确保密钥在我的代码中是主要的,我愿意这样做。我不想把它留给实现脚本的人。如果我必须运行一个额外的查询也没关系,我只想在代码中前进之前检查这个元组中的每个键是否都是主键。谢谢!
编辑:(增加一些清晰度)。所以,想象一下我有一个脚本,它接受一个表名和一个键列表。我想检查这些键中的每一个是否都是给定表中的主键。
好吧,我找到了一个答案,也许不是最好的。我正在寻找某种函数/查询,它会返回一个布尔值,指示键是否是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(",") 。然后,您可以检查。
找出应该在任何 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 │
└─────────────┘