我在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)對於每個表,我打印出來的UID放棄它之前,和他們都不是一個錯誤消息。 2)我打印出information_schema.tables的OID,它不是錯誤消息中的一個。 爲什麼錯誤發生在那個簡單的查詢上?甚至使用information_schema表,甚至不使用用戶創建的表! – tscizzle
@tscizzle:編輯上面的答案。請分享,如果你找到一個修復:-) – Paladin