2014-02-27 37 views
0

我想SQLAlchemy中生成以下SQL代码:SQLAlchemy的:强制列别名引用

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')) 

但我仍然希望使用所有小写字母的名称,因为我的程序的其余部分是全部小写标准化的。任何想法如何强制引用小写版本?

+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

谢谢你的回应,亚历克斯。这些是错别字,并已修复。在生成的SQL代码中使用''“3harm”''生成'“”3harm“”“',这会导致它自己的问题。同时,“3harm”与Python中的“3harm”相同;它会以任何方式评估为字符串,并且生成的SQL仍然无效。 – Vijchti