Python 使用sqlalchemy读取带小写列的熊猫表
我希望将数据库中的表作为数据帧读取。我正在使用sqlalchemy,在我看来它只执行大写的查询 我的模式中的表XYZ有一个小写的列名pred_pred。当我执行以下操作时: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
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