Oracle SQLAlchemy:强制列别名引用
我希望SQLAlchemy生成以下SQL代码:Oracle SQLAlchemy:强制列别名引用,oracle,sqlalchemy,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 keyw
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'))
但是我仍然更喜欢使用所有小写的列名,因为我的程序的其余部分都是标准化的。知道如何强制引用小写版本吗?要生成的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,也没有任何方法来检查两者是否有效;例如,您可能需要在第一个引号中转义双引号,尽管从第二个引号中转义可能更有效。。。我不明白为什么
3Harm
可以不加引号地工作。在寻找其他东西时找到了解决方案
任何列都可以强制使用带有column.quote=True
的引号
因此,对于原始示例:
column = Production.t171.label('3harm')
column.quote = True
session.query(column)
成功 我可以确认oracle有问题,没有引用您的标签,但它会正确地引用带有空格的标签(如
'3 Harm'
)。事实上,sqlalchemy上有一张这样的罚单:。请投票支持这个问题,以提高其优先级。谢谢你的回复,亚历克斯。这些都是打字错误,已经修复。使用“3harm”
在生成的SQL代码中生成“3harm”
,这会导致自身的问题<代码>“3harm”,同时,与Python中的“3harm”
相同;无论哪种方式,它都作为字符串进行计算,生成的SQL仍然无效。