2014-02-27 2 views
0

Я хочу SQLAlchemy генерировать следующий код SQL:SQLAlchemy: Force колонка псевдоним процитировать

SELECT t171 AS "3Harm" FROM production 

Я играл вокруг с чем-то похожее на это SQLAlchemy ОРМ фрагмент кода:

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

Проблема вот что это не правильно цитирует «3harm» в сгенерированном SQL. Вместо "3harm" это порождает неупомянуто 3harm, который является недействительным, поскольку он начинается с числовым характером и, следовательно, возникает следующий Oracle исключение:

ORA-00923: FROM keyword not found where expected 

я могу получить эту работу путем капитализации любого символа в имени псевдонима:

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

Но я бы предпочел использовать все имена столбцов нижнего регистра, так как остальная часть моей программы стандартизована для всех строчных букв. Любая идея, как заставить цитату в нижнем регистре?

+1

Я могу подтвердить, что диалект «оракула» имеет проблему и не цитирует ваш ярлык, но он будет правильно указывать на пробел (например, «3 Harm''). Фактически, для этого есть билет на sqlalchemy: [№ 2138 - имена оракула, начинающиеся с цифр] (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

Спасибо за ответ, Алекс. Это были опечатки и исправлены. Используя '' "3harm" ''генерирует' "" "3harm" "" 'в сгенерированном SQL-коде, что вызывает проблемы самостоятельно. «3harm», между тем, идентичен «3harm» в Python; он оценивается как строка в любом случае, а сгенерированный SQL по-прежнему недействителен. – Vijchti

Смежные вопросы