2013-09-27 3 views
0

SQLAlchemy (python)에서 필터 쿼리를 실행하려고하는데 열 이름에 대소 문자가 구분되는 문제가 있습니다.SQLAlchemy 필터에서 대소 문자를 구분하는 열 ​​이름을 따옴표로 묶습니다.

Base = declarative_base() 
engine = create_engine('postgresql://user:[email protected]:5432/database') 
metadata = MetaData(bind=engine) 

class MyTable(Base): 
    __table__ = Table('my_table', metadata, autoload=True, quote=True) 

을 그리고 여기 필터 쿼리를 실행하고 방법은 다음과 같습니다 :

모델 클래스

은과 같이 스키마에서 자동 생성이이 오류가 발생

val = 1 
result = session.query(MyTable).filter("myCaseSensitiveAttribute=:myCaseSensitiveAttribute").params(myCaseSensitiveAttribute=val).all() 

:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "mycasesensitiveattribute" does not exist LINE 3: WHERE myCaseSensitiveAttribute=1

다른 모든 것은 대소 문자를 구분합니다. 이 문제를 일으키는 것은 필터뿐입니다. 모델 클래스 (이 경우 실용적이지 않음) 또는 변수 값을 기반으로 결과 집합을 필터링하는 다른 작업 방법에서 각 속성을 명시 적으로 정의하지 않고도 열 이름을 인용하도록 강제 할 수 있습니까?

시간 내 주셔서 감사합니다.

답변

0

리터럴 SQL을 사용하는 경우 quote = True는 어떤 일이 일어나도 상관이 없습니다. SQLAlchemy는 문자열이 아닌 Table 및 Column 객체가 SQL을 렌더링하는 데 사용되는 경우에만 인용 할 책임이 있습니다. SQLAlchemy Core 표현식 구문은 대/소문자를 구분하는 식별자를 자동으로 처리하기 때문에 이러한 경우 대다수의 경우 quote = True가 필요하지 않습니다.

예, 사용의 여러 형태를 설명 :

from sqlalchemy import * 
from sqlalchemy.orm import * 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

engine = create_engine('postgresql://scott:[email protected]:5432/test') 
conn = engine.connect() 
trans = conn.begin() 

conn.execute('create table "SomeCaseTable" ("SomeAttribute" varchar(20) primary key)') 
conn.execute('''insert into "SomeCaseTable" ("SomeAttribute") values ('some data')''') 
metadata = MetaData(bind=conn) 

class MyTable(Base): 
    __table__ = Table('SomeCaseTable', metadata, autoload=True) 

session = Session(conn) 
val = 'some data' 

# example 1: use SQL expressions 
print(
    session.query(MyTable). 
     filter(MyTable.SomeAttribute == val). 
     all() 
) 

# example 2: totally literal SQL - you need to quote manually 
print(
    session.query(MyTable). 
     filter('"SomeAttribute"=:some_attribute'). 
     params(some_attribute=val).all() 
) 

# example 3: bound param with SQL expressions 
print(
    session.query(MyTable). 
     filter(MyTable.SomeAttribute == bindparam('somevalue')). 
     params(somevalue=val).all() 
) 
+0

대단히 감사합니다! – drkstr1