2015-01-30 1 views
0

How do I get a raw, compiled SQL query from a SQLAlchemy expression?에서 다음 코드를 얻었습니다. 파이썬 2.7에서 파이썬 3.4로 옮길 때까지 잘 작동했습니다. 코멘트에 '바이트'와 '딕셔너리'파이썬 2.7 ~ 파이썬 3.4 % : 'bytes'와 '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) 
+1

파이썬 2에서는 문자열이 ASCII이지만 파이썬 3에서는 유니 코드이다. 따라서 대부분의 경우 수동으로 encode() 및 decode()를 수행 할 필요가 없습니다. 파이썬 3 유니 코드 지원에 대한 자세한 정보는 https://docs.python.org/3/howto/unicode.html – dylrei

+0

@dylrei입니다. – darwindave

답변

0

감사 : 나는 오류 지원되지 않는 피연산자 유형 (들) %를 함께

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

에 붙어있어하지만 나는 약간 변경 한 , 나는 파이썬 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)