我有一個更新腳本,它接受一些參數,其中一個參數是主鍵的元組,用於標識正確的行。但是,我不檢查以確保密鑰在我的代碼中是主要的,我想。我不想讓任何人執行腳本。如果我必須運行一個額外的查詢,這很好,我只想在代碼中向前移動之前檢查此元組中的每個鍵都是主鍵。謝謝!如何檢查密鑰是否爲主psycopg2
編輯:(增加一些清晰度)。所以,想象一下,我有一個腳本,它包含一個表名和一個鍵列表。我想檢查這些鍵中的每一個在給定表中都是主要的。
我有一個更新腳本,它接受一些參數,其中一個參數是主鍵的元組,用於標識正確的行。但是,我不檢查以確保密鑰在我的代碼中是主要的,我想。我不想讓任何人執行腳本。如果我必須運行一個額外的查詢,這很好,我只想在代碼中向前移動之前檢查此元組中的每個鍵都是主鍵。謝謝!如何檢查密鑰是否爲主psycopg2
編輯:(增加一些清晰度)。所以,想象一下,我有一個腳本,它包含一個表名和一個鍵列表。我想檢查這些鍵中的每一個在給定表中都是主要的。
找出一個表,應在任何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 │
└─────────────┘
我試過了,但它只是返回一個空的結果列表,這是在psql中的工作? –
是的,它應該適用於所有客戶。 –
嗯,我找到了一個答案,也許不是最好的。我正在尋找某種函數/查詢,它將返回一個布爾值,指示該密鑰是否爲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(「,」)。然後,你可以檢查。
問題是對我來說還不夠清楚,但看起來像你可以使用系統目錄來獲得你需要的信息 - http://www.postgresql.org/docs/current/static/catalogs.html –