2015-10-21 56 views
1

我在Python 2.7,使用psycopg2連接到亞馬遜的紅移數據庫。我有單元測試,並且在此測試類的setUp和tearDown方法中,我刪除了爲此測試而創建的表。因此,該方案是:併發問題與psycopg2,紅移,並且單元測試

def setUp(self): 
    drop_specific_tables() 
    create_specific_tables() 

def tearDown(self): 
    drop_specific_tables() 

原因在安裝以及拆卸的情況下測試退出不安全和刪除跳過拆除我們仍然可以知道,每當再次運行時,它仍然會用乾淨的石板開始。

這是drop_specific_tables法,RCUR是指向我們的紅移數據庫psycopg2光標。

def drop_specific_tables(rcur): 
    rcur.execute("BEGIN;") 
    rcur.execute("SELECT table_name " 
       " FROM information_schema.tables " 
       " WHERE table_schema='public' ") 
    tables = [row for row, in rcur] 
    rcur.execute("DROP TABLE IF EXISTS " + ", ".join(tables) + " CASCADE;") 
    rcur.execute("END;") 

當個別測試運行時,它通過。但是,當全班運行,在設置或拆除某些測試錯誤(這是不確定的,其測試誤差和drop_specific_tables),在drop_specific_tables(),上線與

rcur.execute("SELECT table_name " 
      " FROM information_schema.tables " 
      " WHERE table_schema='public' ") 

產生錯誤ProgrammingError: Relation with OID 1454844 does not exist.我打印出'information_schema.tables'的OID,並且與錯誤消息中的OID不同。

爲什麼會發生這種情況?我明白一個關係不存在的意義,但是這個查詢尋找的是什麼關係,它找不到?爲什麼它有時不在那裏,導致查詢出錯?

更新:我還打印出每個表的OID下降之前,和他們都不是在錯誤信息的OID要麼!

回答

1

您使用的是帶有CASCADE選項下降。因此,任何具有參照完整性的表的下降也將放棄與父表關聯的子表。

要解決,如果這實際上是正在運行什麼你的代碼需要與他們的OID現有表的快照之前發生的事情,(我認爲pg_tables或pg_relations應該有這樣的信息)。運行代碼並使用表名的快照檢查錯誤消息的OID。

編輯:這可能是因爲如何計劃在PostgreSQL被緩存(所以在紅移)的功能。這是一個記錄到8.2的錯誤,因此您可能想要爲它尋找修復程序。該計劃將根據該函數的第一次執行進行緩存,但對於第二次執行,某些對象由於重新創建而獲得新的OID。 http://merlinmoncure.blogspot.ie/2007/09/as-previously-stated-postgresql-8.html

http://www.postgresql.org/message-id/[email protected]

+0

一對夫婦的線索自從看了你的答案: 1)對於每個表,我打印出來的UID放棄它之前,和他們都不是一個錯誤消息。 2)我打印出information_schema.tables的OID,它不是錯誤消息中的一個。 爲什麼錯誤發生在那個簡單的查詢上?甚至使用information_schema表,甚至不使用用戶創建的表! – tscizzle

+0

@tscizzle:編輯上面的答案。請分享,如果你找到一個修復:-) – Paladin