gpt4 book ai didi

python - psycopg2、Redshift 和 unittest 的并发问题

转载 作者:行者123 更新时间:2023-11-29 13:26:18 25 4
gpt4 key购买 nike

我在 Python 2.7 中,使用 psycopg2 连接到 Amazon Redshift 数据库。我有单元测试,在这个测试类的 setUp 和 tearDown 方法中,我删除了为这个测试目的而创建的表。所以方案是:

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

def tearDown(self):
drop_specific_tables()

在 setUp 和 tearDown 中删除的原因是,以防测试不安全地退出并跳过 tearDown,我们仍然可以知道,无论何时再次运行,它仍将以干净的状态开始。

这是 drop_specific_tables 方法,rcur 是指向我们的 redshift 数据库的 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;")

当运行单个测试时,它会通过。但是当整个类运行时,在 setUp 或 tearDown 中的某些测试错误(不确定哪个测试错误和哪个 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!

最佳答案

您正在使用带有 CASCADE 选项的 DROP。因此,任何具有参照完整性的表的删除也将删除与父表关联的子表。

要排除这是否真的发生,请在运行代码之前使用现有表的 OID 拍摄快照(我认为 pg_tables 或 pg_relations 应该有此信息)。运行代码并使用表名的快照检查错误消息的 OID。

编辑:这可能是因为计划在 PostgreSQL 中(在 Redshift 中也是如此)缓存函数的方式。在 8.2 之前,这是一个记录在案的错误,因此您可能想要搜索它的修复程序。该计划将根据函数的第一次执行进行缓存,但对于第二次执行,一些对象会因为重新创建而获得新的 OID。 http://merlinmoncure.blogspot.ie/2007/09/as-previously-stated-postgresql-8.html

http://www.postgresql.org/message-id/eea51fdb0708170848w77e27daarfc375ad5c7bc1e09@mail.gmail.com

关于python - psycopg2、Redshift 和 unittest 的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33249580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com