SQLAlchemy:强制列别名引用

时间:2014-02-27 19:27:16

标签: oracle sqlalchemy

我希望SQLAlchemy生成以下SQL代码:

SELECT t171 AS "3Harm" FROM production

我一直在玩类似于这个SQLAlchemy ORM片段:

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

这里的问题是,这在生成的SQL中没有正确引用“3harm”。而不是"3harm"这会生成不带引号的3harm,这是无效的,因为它以数字字符开头,因此会引发以下Oracle异常:

ORA-00923: FROM keyword not found where expected

我可以通过大写别名中的任何字符来实现这一点:

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

但是我仍然希望使用所有小写列名,因为我的程序的其余部分都是标准化的所有小写。知道如何强制引用小写版本吗?

2 个答案:

答案 0 :(得分:1)

在寻找其他东西时找到解决方案。

任何列都可以强制使用column.quote = True的引号。

因此对于原始示例:

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

成功!

答案 1 :(得分: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可以不引用。