Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQLAlchemy:强制列别名引用_Oracle_Sqlalchemy - Fatal编程技术网

Oracle SQLAlchemy:强制列别名引用

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

我希望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'))

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

要生成的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仍然无效。