【问题标题】:python 2.7 to python 3.4 error unsupported operand type(s) for %: 'bytes' and 'dict'python 2.7 到 python 3.4 错误不支持的操作数类型用于 %: 'bytes' 和 'dict'
【发布时间】:2015-03-29 09:57:57
【问题描述】:

我从How do I get a raw, compiled SQL query from a SQLAlchemy expression? 获得了以下代码,它运行良好,直到我们从 Python 2.7 迁移到 Python 3.4。我做了一些改变,虽然我被困住了

return (comp.string.encode(enc) % params).decode(enc)

错误为 %: 'bytes' and 'dict' 的操作数类型不受支持

def compile_query(query):
    dialect = query.session.bind.dialect
    statement = query.statement
    comp = compiler.SQLCompiler(dialect, statement)
    comp.compile()
    enc = dialect.encoding
    params = {}
    for k,v in comp.params.iteritems():
        if isinstance(v, unicode):
            v = v.encode(enc)
        params[k] = sqlescape(v)
    return (comp.string.encode(enc) % params).decode(enc)

【问题讨论】:

  • 在 Python 2 中,字符串是 ASCII,但在 Python 3 中,它们是 Unicode。因此,在大多数情况下,您不需要手动进行 encode() 和 decode()。有关 Python 3 Unicode 支持的更多信息:docs.python.org/3/howto/unicode.html
  • @dylrei 做到了,谢谢

标签: python postgresql sqlalchemy python-3.4


【解决方案1】:

感谢 cmets,我把它移植到了 python 3

def compile_query(query):
    dialect = query.session.bind.dialect
    statement = query.statement
    comp = compiler.SQLCompiler(dialect, statement)
    comp.compile()
    enc = dialect.encoding
    params = {}
    for k,v in comp.params.items():
        if isinstance(v, str):
            v = v.encode(enc)
        params[k] = sqlescape(v)
    return (comp.string % params)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2013-06-14
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多