在用SQLAlchemy向PostgresQL BYTEA列插入字符串时的UTF-8错误

3 投票
1 回答
1241 浏览
提问于 2025-04-18 09:37

我在一个PostgresQL表里有一列,类型是BYTEA。这个模型类把这一列定义为LargeBinary字段,文档上说“Binary类型在创建表时会生成BLOB或BYTEA,并且还会使用每个数据库API提供的Binary可调用对象来转换传入的值。”

我有一个Python字符串,想把它插入到这个表里。

这个Python字符串是:

'\x83\x8a\x13,\x96G\xfd9ae\xc2\xaa\xc3syn\xd1\x94b\x1cq\xfa\xeby$\xf8\xfe\xfe\xc5\xb1\xf5\xb5Q\xaf\xc3i\xe3\xe4\x02+\x00ke\xf5\x9c\xcbA8\x8c\x89\x13\x00\x07T\xeb3\xbcp\x1b\xff\xd0\x00I\xb9'

我SQLAlchemy代码中相关的部分是:

    migrate_engine.execute(
        """
        UPDATE table
        SET x=%(x)s
        WHERE id=%(id)s
        """,
        x=the_string_above,
        id='1')

我遇到了这个错误:

sqlalchemy.exc.DataError: (DataError) invalid byte sequence for encoding "UTF8": 0x83
'\n            UPDATE table\n            SET x=%(x)s\n            WHERE id=%(id)s\n            ' {'x': '\x83\x8a\x13,\x96G\xfd9ae\xc2\xaa\xc3syn\xd1\x94b\x1cq\xfa\xeby$\xf8\xfe\xfe\xc5\xb1\xf5\xb5Q\xaf\xc3i\xe3\xe4\x02+\x00ke\xf5\x9c\xcbA8\x8c\x89\x13\x00\x07T\xeb3\xbcp\x1b\xff\xd0\x00I\xb9', 'id': '1',}

如果我直接进入pgadmin3控制台并输入UPDATE命令,更新就能正常工作。这个错误显然是来自SQLAlchemy。这个字符串是一个有效的Python2字符串。那一列的类型是BYTEA。这个查询在没有SQLAlchemy的情况下可以正常工作。有没有人能看出为什么Python会认为这个字节字符串是UTF-8格式的?

相关问题:

1 个回答

1

试着把数据放在一个 buffer 里:

migrate_engine.execute(
    """
    UPDATE table
    SET x=%(x)s
    WHERE id=%(id)s
    """,
    x=buffer(the_string_above),
    id='1')

撰写回答