UTF-8尝试使用SQLAlchemy将字符串插入PostgresQL BYTEA列时出错

时间:2014-06-12 22:03:08

标签: python postgresql utf-8 sqlalchemy

我在BYTEA类型的PostgresQL表中有一个列。模型类将列定义为LargeBinary字段,文档说“二进制类型在创建表时生成BLOB或BYTEA,并使用每个DB-API提供的二进制可调用来转换传入值。”< / p>

我有一个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 个答案:

答案 0 :(得分:1)

尝试将数据包装在buffer

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