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

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

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

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

【问题讨论】:

    标签: python unicode sqlalchemy insertion


    【解决方案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】:

      有几种选择:

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

      【讨论】:

      • 你试图删除问题而不是解决它。关于数字3:sqlalchemy的官方文档说使用Unicode type但你说使用String(convert_unicode=True),我有同样的问题,但我没有认为 sqlalchemy 用disable warning 解决,因为它有clean code 而不是dirty
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2012-10-17
      相关资源
      最近更新 更多