我想使用枚举将组织数据存储在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。

09-26 12:02