将字符串插入 SQLAlchemy Unicode 列的正确方法

Posted

技术标签:

【中文标题】将字符串插入 SQLAlchemy Unicode 列的正确方法【英文标题】:Proper Way to Insert Strings to a SQLAlchemy Unicode Column 【发布时间】:2011-08-09 18:22:22 【问题描述】:

我有一个带有 Unicode 列的 SQLAlchemy 模型。我有时会在其中插入 unicode 值(u'Value'),但有时也会插入 ASCII 字符串。解决此问题的最佳方法是什么?当我插入带有特殊字符的 ASCII 字符串时,我收到以下警告:

SAWarning: Unicode type received non-unicode bind param value ...

如何避免这种情况?插入不同类型字符串的正确方法是什么?

【问题讨论】:

【参考方案1】:

你应该这样定义你的表类和构造函数:

class User(declarative_base()):
    _tablename__ = 'user'
    name = Column(Unicode(200, convert_unicode=False))
    textfield = Column(UnicodeText(convert_unicode=False))

user = Table('user', MetaData(),
Column('name', Unicode(200, convert_unicode=False), nullable=False),
Column('textfield', UnicodeText(convert_unicode=False), nullable=False),
)

当然,你不应该忘记为create_engine function附加URI+"charset=utf8"

【讨论】:

【参考方案2】:

有几种选择:

    使用 warnings.simplefilter('ignore', sqlalchemy.exc.SAWarning) 禁用所有 SQLAlchemy 警告。 仅通过模块和 lineno 或消息使用更具体的过滤器规范禁用此警告,例如warnings.filterwarnings('ignore', '^Unicode type received non-unicode bind param value', sqlalchemy.exc.SAWarning)。 使用String(convert_unicode=True) 代替Unicode 类型。 重新考虑问题并更改代码以使用 unicode,即使是 ASCII 字符串。

【讨论】:

你试图删除问题而不是解决它。关于数字3:sqlalchemy的官方文档说使用Unicode type但你说使用String(convert_unicode=True),我有同样的问题,但我没有认为 sqlalchemy 用disable warning 解决,因为它有clean code 而不是dirty

以上是关于将字符串插入 SQLAlchemy Unicode 列的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

mssql db 和 sqlalchemy 中表/列的 Unicode 名称

将 unicode 文本插入 pyx 画布

SQLAlchemy的常用数据类型

sqlalchemy做批量数据插入的时候要注意啥?有啥可以优化的

尝试使用 SQLAlchemy 将数据插入雪花数据库表

Jquery插入unicode而不是符号