我想使用枚举将组织数据存储在PostgreSQL数据库中。由于组织名称有时会更改,所以有时需要更新枚举值,我想使用Python和sqlalchemy
自动实现这一点。但是,在更改枚举之后,无法插入新值。
我怀疑这是由于内部psycopg2
方法的原因,因为数据库确实接受新值。您知道更新check()
已知类型的方法吗?
以下是我对此脚本的测试:
class DbconTestCase(unittest.TestCase):
def setUp(self):
self.engine, self.meta = db.get_connection('test_user', 'test_pass', 'testdb')
# Create test table, which will be deleted later
self.test_table = Table('test_table', self.meta,
Column('id', Integer, primary_key=True),
Column('type', Enum('number', 'text', 'image', name='type'), nullable=False),
Column('text', String(32)))
self.meta.create_all()
def test_add_enum_value(self):
try:
# Add new value to enum named 'type'
db.add_enum_value(self.engine, 'type', 'object')
except Exception as exp:
self.assertTrue(False, msg=exp.__cause__)
else:
self.assertTrue(True)
def test_bulk_copy(self):
types = ['number', 'text', 'image', 'object']
objects = [{'id': idx,
'type': types[idx % len(types)],
'text': 'random text to insert'} for idx in range(10000)]
try:
db.bulk_copy(self.engine, str(self.test_table.name), objects)
except Exception as exp:
self.assertTrue(False, msg=exp.__cause__)
else:
self.assertTrue(True)
def tearDown(self):
self.meta.drop_all()
还有一点解释:基本上我在测试数据库中创建了一个测试表,然后用一个新值扩展了一个枚举类型。然后我尝试插入大量数据,其中包括枚举的新值。我得到以下错误:
psycopg2.DataError: invalid input value for enum type: "object"
最佳答案
我也遇到了这个问题,然后我解决了直接从this answers后面的PostgreSQL更新enum值的问题,我们也可以直接从this answer后面的PostgreSQL更新enum。