2017-12-13 3 views
0

SQLAlchemy를 사용하여 PostgreSQL 데이터베이스에서보기를 만들려고합니다. sqlalchemy-views에서 CreateView 컴파일러를 사용하고 있습니다. 나는 참고로이 질문에 대한 답변을 사용하고 있습니다 :보기를 만들 때 KeyError

How to create an SQL View with SQLAlchemy?

뷰를 생성하는 내 코드는 다음과 같습니다

그러나
def create_view(self, myparameter): 
    mytable = Table('mytable', metadata, autoload=True) 
    myview = Table('myview', metadata) 
    engine.execute(CreateView(myview, mytable.select().where(mytable.c.mycolumn==myparameter))) 

, 나는이 쿼리를 실행하려고는 다음과 같은 예외가 발생 :

KeyError: 'mycolumn_1' 

컴파일 된 쿼리를 보면, 내 매개 변수 값에 대한 자리가 교체되지 않는 것 같습니다 :

'\nCREATE VIEW myview AS SELECT mytable.mycolumn \nFROM mytable \nWHERE mytable.mycolumn = %(mycolumn_1)s\n\n' 

자리 표시자가 대체되지 않으므로 쿼리가 실패합니다. 그러나 내 코드가 예제와 많이 다르지 않기 때문에 대체가 발생하지 않는 이유는 알 수 없습니다.

첫 번째 의심은 아마도 매개 변수의 유형과 열이 호환되지 않는 것일 수 있습니다. 현재 매개 변수는 데이터베이스의 텍스트 열에 매핑되어야하는 유니 코드 문자열로 제공됩니다. 또한 동일한 (실패한) 결과 bigint 열 긴 매개 변수 매핑 시도했다.

다른 제안이 있으십니까?

+0

먼저 전체 추적을 포함하십시오. KeyError는 어떤 이유로 매개 변수가 올바르게 전달되지 않아서 자리 표시자를 대체하려고 할 때 실패 함을 나타냅니다. 둘째로, 코드를 그대로 붙여 넣지 말고 다른 사람들도 잘 작업 할 수있는 [mcve]를 만드십시오. –

답변

0

SQLAlchemy 설명서에서 표현식 시간에 궁극적으로 사용되는 실제 값을 전달할 때 bindparam()used입니다. 좋은 예가 또한 제공됩니다.

from sqlalchemy import bindparam 

stmt = select([users_table]).\ 
      where(users_table.c.name == bindparam('username')) 
+0

'mytable.c.mycolumn == myparameter'는 실제로 자동으로 바인드 매개 변수를 생성해야하지만 어떤 이유로 실패합니다. 언급 한 예제는 실제 값을 제공하는 데 지연되는 경우에 유용합니다. –