我想使用Enums将组织数据存储在PostgreSQL数据库中。由于组织名称有时会发生变化,我有时需要更新Enum值,并且我希望使用Python sqlalchemy
和psycopg2
来自动化它。但是,在更改枚举后,无法插入新值。
我怀疑这是由check()
的内部psycopg2
方法引起的,因为数据库确实接受了新值。您是否知道更新psycopg2
已知类型的方法?
以下是我对此脚本的测试:
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"
答案 0 :(得分:0)
我也遇到了这个问题,然后我解决了该问题,直接在this answers之后从 PostgreSQL 更新了枚举值,我们还可以按照this answer在< strong> PostgreSQL 直接。