如何使用 to_sql 将 pandas 数据帧写入 oracle 数据库?
How to write pandas dataframe to oracle database using to_sql?
我是一个新的 oracle 学习者。我正在尝试将 pandas 数据帧写入 oracle table。上网查了一下,发现代码本身很简单,就是不知道为什么我的代码不行。
我已经从我的本地文件中读取了 pandas 数据框:
import cx_Oracle
import pandas as pd
import os
dir_path = os.path.dirname(os.path.realpath("__file__"))
df = pd.read_csv(dir_path+"/sample.csv")
现在打印df,dataframe df应该是这样的:
DATE YEAR MONTH SOURCE DESTINATION
0 11/1/2017 1:00 2017 1 AL CO
1 11/2/2017 1:00 2017 5 GA ID
2 11/3/2017 1:00 2017 12 GA MO
然后我使用 cx_Oracle 创建与数据库的连接,它起作用了。接下来我尝试将数据帧 df 写入 table TEST。这个table TEST 是一个空的table,它已经存在于oracle 数据库中,它在oracle 中有包括DATE、YEAR、MONTH、SOURCE、DESTINATION 的列。所有数据类型都匹配 df 示例数据。我的代码如下:
conn_str = u'account/password@host:1521/server'
conn = cx_Oracle.connect(conn_str)
# Write records stored in a DataFrame to a oracle database
df.to_sql('TEST', conn, if_exists='replace') # the error shows here
conn.close()
显示错误:
DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master
WHERE type='table' AND name=?;': ORA-01036: illegal variable
name/number
如何解决问题?非常感谢您的宝贵时间!
我在 SO 上看到过类似的问题 - 当您尝试使用 cx_Oracle
创建的连接对象写入 Oracle DB 时会发生这种情况。
尝试使用 SQL Alchemy 创建连接:
import cx_Oracle
from sqlalchemy import types, create_engine
conn = create_engine('oracle+cx_oracle://scott:tiger@host:1521/?service_name=hr')
df.to_sql('TEST', conn, if_exists='replace')
我可以使用以下代码加载 Oracle table:
import pandas as pd
import os
creds = {}
creds['tns_admin'] = 'Wallet_Path'
creds['sid'] = 'dev_low'
creds['user'] = 'username'
creds['password'] = pwd
os.environ['TNS_ADMIN'] = creds['tns_admin']
uri = 'oracle+cx_oracle://' + creds['user'] + ':' + creds['password'] + '@' + creds['sid']
df = pd.read_csv("test.csv")
df.to_sql('test', uri, schema='PRD', if_exists='replace')
我们需要构建并传递一个 URI,而不是连接。
注意:新的Oracle数据库(Autonomous)需要钱包,所以我们需要在TNS_ADMIN环境变量中设置钱包路径。
此外,我不必导入 cx_Oracle,我仔细检查了
为了确保我没有被愚弄,我放弃了 table 并提交了
然后我执行了上面的代码,它用数据创建了新的 table。
参考 this 解决方案后,我能够使用以下步骤完成此操作。
from sqlalchemy.engine import create_engine
DIALECT = 'oracle'
SQL_DRIVER = 'cx_oracle'
USERNAME = 'your_username'
PASSWORD = 'your_password'
HOST = 'subdomain.domain.tld'
PORT = 1521
SERVICE = 'your_oracle_service_name'
ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE
engine = create_engine(ENGINE_PATH_WIN_AUTH)
成功创建 SQLAlchemy 引擎后,您可以将其传递给 pandas to_sql()
函数。
df.to_sql('name_of_sql_table',engine,schema='your_schema')
我是一个新的 oracle 学习者。我正在尝试将 pandas 数据帧写入 oracle table。上网查了一下,发现代码本身很简单,就是不知道为什么我的代码不行。
我已经从我的本地文件中读取了 pandas 数据框:
import cx_Oracle
import pandas as pd
import os
dir_path = os.path.dirname(os.path.realpath("__file__"))
df = pd.read_csv(dir_path+"/sample.csv")
现在打印df,dataframe df应该是这样的:
DATE YEAR MONTH SOURCE DESTINATION
0 11/1/2017 1:00 2017 1 AL CO
1 11/2/2017 1:00 2017 5 GA ID
2 11/3/2017 1:00 2017 12 GA MO
然后我使用 cx_Oracle 创建与数据库的连接,它起作用了。接下来我尝试将数据帧 df 写入 table TEST。这个table TEST 是一个空的table,它已经存在于oracle 数据库中,它在oracle 中有包括DATE、YEAR、MONTH、SOURCE、DESTINATION 的列。所有数据类型都匹配 df 示例数据。我的代码如下:
conn_str = u'account/password@host:1521/server'
conn = cx_Oracle.connect(conn_str)
# Write records stored in a DataFrame to a oracle database
df.to_sql('TEST', conn, if_exists='replace') # the error shows here
conn.close()
显示错误:
DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ORA-01036: illegal variable name/number
如何解决问题?非常感谢您的宝贵时间!
我在 SO 上看到过类似的问题 - 当您尝试使用 cx_Oracle
创建的连接对象写入 Oracle DB 时会发生这种情况。
尝试使用 SQL Alchemy 创建连接:
import cx_Oracle
from sqlalchemy import types, create_engine
conn = create_engine('oracle+cx_oracle://scott:tiger@host:1521/?service_name=hr')
df.to_sql('TEST', conn, if_exists='replace')
我可以使用以下代码加载 Oracle table:
import pandas as pd
import os
creds = {}
creds['tns_admin'] = 'Wallet_Path'
creds['sid'] = 'dev_low'
creds['user'] = 'username'
creds['password'] = pwd
os.environ['TNS_ADMIN'] = creds['tns_admin']
uri = 'oracle+cx_oracle://' + creds['user'] + ':' + creds['password'] + '@' + creds['sid']
df = pd.read_csv("test.csv")
df.to_sql('test', uri, schema='PRD', if_exists='replace')
我们需要构建并传递一个 URI,而不是连接。
注意:新的Oracle数据库(Autonomous)需要钱包,所以我们需要在TNS_ADMIN环境变量中设置钱包路径。
此外,我不必导入 cx_Oracle,我仔细检查了
为了确保我没有被愚弄,我放弃了 table 并提交了
然后我执行了上面的代码,它用数据创建了新的 table。
参考 this 解决方案后,我能够使用以下步骤完成此操作。
from sqlalchemy.engine import create_engine
DIALECT = 'oracle'
SQL_DRIVER = 'cx_oracle'
USERNAME = 'your_username'
PASSWORD = 'your_password'
HOST = 'subdomain.domain.tld'
PORT = 1521
SERVICE = 'your_oracle_service_name'
ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE
engine = create_engine(ENGINE_PATH_WIN_AUTH)
成功创建 SQLAlchemy 引擎后,您可以将其传递给 pandas to_sql()
函数。
df.to_sql('name_of_sql_table',engine,schema='your_schema')