将字符串插入 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 名称