【问题标题】:sqlalchemy - (ProgrammingError) can interpret 8-bit bytestringssqlalchemy - (ProgrammingError) 可以解释 8 位字节串
【发布时间】:2014-07-15 14:15:52
【问题描述】:

我在 python 2.7.6 中使用 do SqlAlchemy

我遇到了:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) 不得使用 8 位字节 字符串,除非您使用可以解释 8 位字节串的 text_factory(例如 text_factory = str)。强烈建议您直接切换您的 应用于 Unicode 字符串。 u'INSERT INTO 算法(“nomeAlgoritimo”,分类 se,“esttruturaDados”,“complexidadePiorCaso”,“complexidadeMedioCaso”,“complexi dadeMelhorCaso", "complexidadeEspacos", "pseudoAlgoritimo") 值 (?, ?, ?, ?, ?, ?, ?, ?)' ('Ordena\xe7\xe3o Sele\xe7\xe3o', 'Algoritmo de oderna\xe7\xe3o', ' Array, Listas ligadas', 'O(n^2)', 'O(n^2)', 'O(n^2)', 'O(n) total, O(1) auxiliar ', '')

我用:

基数 = 声明基数() engine = create_engine('sqlite:///classificacao_pesquisa.db')

class Algoritimo(Base):
    __tablename__ = 'algoritimo'
    id = Column(Integer, primary_key=True)
    nomeAlgoritimo = Column(String(50))
    classe = Column(String(250))
    estruturaDados = Column(String(50))
    complexidadePiorCaso = Column(String(50))
    complexidadeMedioCaso = Column(String(50))
    complexidadeMelhorCaso = Column(String(50))
    complexidadeEspacos = Column(String(50))
    pseudoAlgoritimo = Column(String(4000))

你有什么建议吗?

【问题讨论】:

    标签: sqlite python-2.7 sqlalchemy


    【解决方案1】:

    在需要Unicode string type 的地方使用db.Column(db.UnicodeText(64))

    【讨论】:

    • 我正在测试 [nomeAlgoritimo = Column(UnicodeText(50))] 但我没有成功。
    • 然后为 sqlite engine.connect().connection.connection.text_factory = str 设置相应的 text_factory
    • 但是,我使用 sqlAlchemy:engine = create_engine('sqlite:///classificacao_pesquisa.db') Base.metadata.bind = engine DBSession = sessionmaker(bind=engine)
    • 我只看到两种可能的解决方案...使用 Unicode 字符串类型或使用 text_factory = str,也是有用的链接,如今常青树:farmdev.com/talks/unicode。
    【解决方案2】:

    我遇到了同样的问题,这里是解决方案;

    Coercing Encoded Strings to Unicode

    如上述文档中所述,db.Unicode 类型是不够的,您仍然必须以 u'some string' 的形式发送字符串;

    关于 Unicode 类型的一个常见混淆来源是它是 旨在仅处理 Python 端的 Python unicode 对象, 表示作为绑定参数传递给它的值必须采用以下形式 u'some string' 如果使用 Python 2 而不是 3。编码/解码 它执行的功能只是为了满足使用中的 DBAPI 的要求, 并且主要是私有的实现细节。

    因此您可以使用 TypeDecorator 创建自己的类型;

    from sqlalchemy.types import TypeDecorator, Unicode
    
    class CoerceUTF8(TypeDecorator):
        """Safely coerce Python bytestrings to Unicode
        before passing off to the database."""
    
        impl = Unicode
    
        def process_bind_param(self, value, dialect):
            if isinstance(value, str):
                value = value.decode('utf-8')
            return value
    

    用法:

    some_value = db.Column(CoerceUTF8)) 
    

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 2011-02-19
      • 2011-08-02
      • 1970-01-01
      • 2015-02-27
      • 2017-09-09
      • 2013-04-26
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多