如何使用SQLAlchemy + PostgreSQL删除自定义类型?

3
我有一个清理数据库的脚本,在我们的测试中广泛使用。
首先,我们尝试使用SQLAlchemy Metadata.drop_all()方法,但它在删除时没有解决一些外键问题,导致错误。然后,我发现了@zzzeek的这个脚本,它几乎做了同样的事情,但是以“智能”的方式处理所有外键问题。但现在存在几个关于更改的自定义类型(ENUM)的问题。问题是,如何使用SQLAlchemy将它们全部删除?只能手动执行DROP TYPE吗?
数据库中的表是用Alembic创建的,即使上面的脚本成功删除了所有表,一些自定义ENUM仍然存在,并且在尝试重新创建它们时会失败。
重新创建整个数据库不是首选解决方案,因为应用程序的默认DB用户通常不应该拥有创建数据库的权限。
2个回答

1

您确定您的元数据实例完全描述了所有表格吗?

尝试:

Metadata.reflect()
Metadata.drop_all()

0

这是一个古老的问题,但如果在任何postgresql.ENUM定义中出现create_type=False,仍然有可能遇到这个问题。

根据SQLAlchemy文档中关于create_type的说明,

当为False时,除非调用ENUM.create()或ENUM.drop(),否则不会执行任何检查,也不会发出CREATE TYPE或DROP TYPE。

这意味着在运行测试时,虽然可能会有使用create_all()drop_all()进行设置和拆卸,但两者都不会影响自定义枚举类型。

解决方案很简单,只需删除create_type=False,因为True是默认值。然后,在测试开始时创建所有自定义类型,在结束时删除它们,从而得到完全干净的测试数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接