2014-02-27 4 views
0

내가 SQLAlchemy의 다음과 같은 SQL 코드를 생성 할 인용 강제로 열 별칭 :SQLAlchemy의 :

SELECT t171 AS "3Harm" FROM production 

나는이 SQLAlchemy의 ORM 비슷한 주변에 놀았 던은 니펫을 :

session.query(Production.t171.label('3harm')) 

문제 이것은 생성 된 SQL에서 "3harm"을 적절하게 인용하지 않는다는 것입니다.

ORA-00923: FROM keyword not found where expected 

나는이 별칭 이름에 모든 문자를 대문자로 작동시킬 수 있습니다 : 그것은 숫자 문자로 시작하기 때문에 다음과 같은 오라클 예외가 발생하기 때문에 대신 "3harm"이가 잘못 인용 부호로 둘러싸이지 않은 3harm 생성

session.query(Production.t171.label('3Harm')) 

그러나 나머지 프로그램은 모두 소문자로 표준화되어 있기 때문에 소문자 열 이름을 사용하는 편이 더 좋습니다. 어떤 아이디어를 어떻게 소문자 버전을 인용합니까?

+1

나는 'oracle' 언어가 문제가 있고 당신의 레이블을 인용하지 않고 있음을 확인할 수 있습니다.하지만''3 Harm' '과 같이 공백으로 적절하게 인용 할 것입니다. 사실, sqlalchemy에 대한 티켓이 있습니다 : [Issue # 2138 - 숫자로 시작하는 oracle 바인드 이름] (https://bitbucket.org/zzzeek/sqlalchemy/issue/2138/oracle-bind-names-that- 시작과 함께). 우선 순위를 높이려면 문제에 투표하십시오. – van

답변

1

다른 해결책을 찾고있는 동안 해결책을 찾았습니다.

어떤 열도 column.quote = True과 함께 인용 부호를 사용해야 할 수 있습니다. 그래서 원래 예를 들어

:

column = Production.t171.label('3harm') 
column.quote = True 
session.query(column) 

성공!

0

생성하려는 SQL이 유효하지 않습니다.

SELECT t171 AS "3Harm" FROM production 

그래서이 작업을 수행 할 수 있어야 다음과 같습니다 :

SELECT t171 AS '3Harm' FROM production 

... 당신이 따옴표 단일하지 따옴표로 묶어야하는 식별자가 필요하지 않고이보다

session.query(Production.t171.label('"3harm"')) 

아니면 :

session.query(Production.t171.label("3harm")) 

하지만 SQLAlchemy를 사용하지 않고 어느 것이 유효한지 확인할 방법이 없습니다. 예를 들어 this에서 두 번째 따옴표가 더 효과적 일 수 있지만 첫 번째 따옴표에서 큰 따옴표를 이스케이프해야 할 수도 있습니다 ... 3Harm이 인용 부호없이 작동하는 이유를 이해할 수 없습니다.

+0

응답 해 주셔서 감사합니다, Alex. 그것들은 오타 였고 수정되었습니다. '' "3harm" ''을 사용하면 생성 된 SQL 코드에'' "3harm" ""'이 생성되어 문제가 발생합니다. ''3harm "'은 파이썬에서''3harm ''과 동일합니다. 그것은 문자열로 평가되며 생성 된 SQL은 여전히 ​​유효하지 않습니다. – Vijchti