Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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
Python 使用sqlalchemy读取带小写列的熊猫表_Python_Sql_Pandas_Oracle_Sqlalchemy - Fatal编程技术网

Python 使用sqlalchemy读取带小写列的熊猫表

Python 使用sqlalchemy读取带小写列的熊猫表,python,sql,pandas,oracle,sqlalchemy,Python,Sql,Pandas,Oracle,Sqlalchemy,我希望将数据库中的表作为数据帧读取。我正在使用sqlalchemy,在我看来它只执行大写的查询 我的模式中的表XYZ有一个小写的列名pred_pred。当我执行以下操作时: import pandas as pd import cx_Oracle as ora from sqlalchemy import create_engine from sqlalchemy.engine import url connect_url = url.URL(...) engine = create_engi

我希望将数据库中的表作为数据帧读取。我正在使用sqlalchemy,在我看来它只执行大写的查询

我的模式中的表XYZ有一个小写的列名pred_pred。当我执行以下操作时:

import pandas as pd
import cx_Oracle as ora
from sqlalchemy import create_engine
from sqlalchemy.engine import url

connect_url = url.URL(...)
engine = create_engine(connect_url)
connection = engine.connect()

input = pd.read_sql_query('SELECT pred_pred FROM XYZ', connection)
input = pd.read_sql_query('SELECT "pred_pred" FROM XYZ', connection)
我得到以下错误:

DatabaseError: ORA-00904: "PRED_PRED": invalid identifier
有解决办法吗


编辑:作为一种解决方法,目前我只是使用*导入所有列,然后在pandas中处理它们,因为表只有很少的列。我仍然想知道是否有可能以更直接的方式解决这个问题。

如注释中所述,您应该只添加双引号来包装列,因为oracle将其转换为大写,如果不使用双引号包装

create table table1 ("column1" VARCHAR2(20));
我认为您需要以下内容:

import pandas as pd
import cx_Oracle as ora
from sqlalchemy import create_engine
from sqlalchemy.engine import url

connect_url = url.URL(...)
engine = create_engine(connect_url)
connection = engine.connect()

input = pd.read_sql_query('SELECT pred_pred FROM XYZ', connection)
input = pd.read_sql_query('SELECT "pred_pred" FROM XYZ', connection)
因为您必须创建包含双引号的列的xyz表,所以它存储为区分大小写的名称,即小写

请参阅此以了解更多说明


干杯

这取决于表格最初是如何创建的。默认情况下,不管该表的DDL是大写还是小写,Oracle都会将其全部更改为大写并存储在数据库中

这意味着,下面的DDL语句对于Oracle是相等的:

create table table1 (column1 VARCHAR2(20));
CREATE TABLE TABLE1 (COLUMN1 VARCHAR2(20));
具有这种创建DDL的表可以通过以下两种方式进行简单查询:

SELECT COLUMN1 FROM TABLE1;
SELECT column1 FROM table1;
但是,不同的问题是,当使用双引号指定表名或列时

create table table1 ("column1" VARCHAR2(20));
然后,每次查询该列时,必须始终使用这些引号和创建时的确切大小写再次查询该列:

SELECT "column1" FROM TABLE1;
关于Python代码,在REPL中,似乎可以轻松地将双引号与单引号结合起来:

>>>input = 'SELECT "pred_pred" FROM XYZ'
>>>input
>>>'SELECT "pred_pred" FROM XYZ'
因此,您可以使用以下代码更改代码:

input = pd.read_sql_query('SELECT "pred_pred" FROM XYZ', connection)
为了确保我们在这里讨论的问题是正确的,您可能希望通过SQL developer和query等连接到数据库:

SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE UPPER(TABLE_NAME) = 'XYZ'
如果列名称不是全部大写,则它是用双引号创建的,因此必须以相同的方式进行查询。 关于命名规则的进一步阅读


您已经在评论中提到了使用*的解决方法,但使用*进行查询并在Python端执行投影部分似乎不是一个好主意,因为这将在数据库端引发所需的IO操作。

在SQL中,不带引号的标识符不区分大小写,Oracle将不带引号的标识符转换为大写,例如,如果我没记错的话,Postgres做的恰恰相反。如果您的列是小写的,也许您必须使用一个带引号的标识符:pred_pred,谢谢您的回复。您的意思是使用query='SELECT'+pred_pred+'FROM XYZ'?我收到了相同的错误消息。不,他的意思是query='SELECT pred_pred FROM XYZ'。顺便说一句,千万不要使用这样的字符串连接,因为存在注入漏洞。@BarbarosÖzhan-hear:D:D@BarbarosÖzhan什么都有,而且她已经长大了很多,所以我想应该拍一张新照片:D