[英]Connecting to an Oracle database using SQLAlchemy
我能够成功连接到 SQLite 数据库并使用以下命令集访问特定表:
from sqlalchemy import create_engine, MetaData, Table, and_
from sqlalchemy.sql import select
from pandas import DataFrame
db = create_engine('sqlite:///path\\database.db')
metadata = MetaData(db)
table = Table('table name', metadata, autoload=True)
我能够使用cx_Oracle从 Oracle 数据库中获取数据。
但是,当我尝试连接到 SQLAlchemy 中的 Oracle 数据库时,出现以下错误:
NoSuchTableError: <表名>
我使用了以下命令:
db = create_engine('oracle://username:password@hostname:1521/instance name', echo='debug')
md = MetaData(bind=db)
t = Table('table name', md, autoload=True, schema='schema name')
当我使用以下命令时:
t= Table('table name', md, autoload=True, oracle_resolve_synonyms=True)
我收到以下错误:
AssertionError:架构可见多个表,您必须指定所有者
你能解释一下我到底哪里错了吗?
您不再需要导入 cx_Oracle。 较新版本的 sqlalchemy 模块调用函数 cx_Oracle.makedsn()。 看一看:
from sqlalchemy.engine import create_engine
DIALECT = 'oracle'
SQL_DRIVER = 'cx_oracle'
USERNAME = 'your_username' #enter your username
PASSWORD = 'your_password' #enter your password
HOST = 'subdomain.domain.tld' #enter the oracle db host url
PORT = 1521 # enter the oracle port number
SERVICE = 'your_oracle_service_name' # enter the oracle db service name
ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE
engine = create_engine(ENGINE_PATH_WIN_AUTH)
#test query
import pandas as pd
test_df = pd.read_sql_query('SELECT * FROM global_name', engine)
from sqlalchemy import create_engine
import cx_Oracle
host=hostname
port=port
sid='sid'
user='username'
password='password'
sid = cx_Oracle.makedsn(host, port, sid=sid)
cstr = 'oracle://{user}:{password}@{sid}'.format(
user=user,
password=password,
sid=sid
)
engine = create_engine(
cstr,
convert_unicode=False,
pool_recycle=10,
pool_size=50,
echo=True
)
result = engine.execute('select * from TABLE')
for row in result:
print row
这对我有用。 也可以像这样创建连接对象
conn = engine.connect()
conn.close()
这将允许关闭连接。 即使您有从本地端口到远程数据库的隧道,这也有效。
假设你的机器上有一个带有有效 tnsnames.ora 文件的 Oracle 客户端,这对我有用:
from sqlalchemy import create_engine
import pandas as pd
engine = create_engine('oracle://myusername:mypassword@SID')
con = engine.connect()
outpt = con.execute("SELECT * FROM YOUR_TABLE")
df = pd.DataFrame(outpt.fetchall())
df.columns = outpt.keys()
print(df.head())
con.close()
当没有tnsnames.ora
文件时,这对我tnsnames.ora
。
user = 'system'
pwd = 'oracle'
dsn = cx_Oracle.makedsn(
'192.168.1.105', 49161,
# service_name='your_service_name_if_any'
)
ora_engine = create_engine(f'oracle+cx_oracle://{user}:{pwd}@{dsn}', echo=True)
ora_engine.connect()
这是@mkarun2 答案的略微改进版本。
先决条件:
安装软件包:
sudo apt 安装 libaio1
下载 Oracle InstantClient 库
制作符号链接:
ln -s libclntsh.so.21.1 libclntsh.so
像这样运行应用程序:
导出 LD_LIBRARY_PATH=oracle-instantclient/instantclient_21_1 python main.py
这是main.py
:
import cx_Oracle
import sqlalchemy as sa
# Use your config
username = 'username'
password = 'security'
hostname = 'localhost'
service_name = 'Xal' or None
port = '1521'
# Tell cx_Oracle where to find the libraries. Optional.
cx_Oracle.init_oracle_client(lib_dir='oracle-instantclient/instantclient_21_1')
# Connection string
oracle_connection_string_fmt = (
'oracle+cx_oracle://{username}:{password}@' +
cx_Oracle.makedsn('{hostname}', '{port}', service_name='{service_name}')
)
url = oracle_connection_string_fmt.format(
username=username, password=password,
hostname=hostname, port=port,
service_name=service_name,
)
# Create SqlAlchemy Engine
engine: sa.engine.Engine = sa.create_engine(url, echo=True)
以下是进行第一个查询的方法:
res: sa.engine.cursor.LegacyCursorResult = engine.execute("SELECT * FROM tablename")
for row in res:
print(row)
请注意,该查询没有;
最后 ;) Oracle 不喜欢分号。
“...如果您已经有一个与 cx_Oracle 一起使用的连接字符串”:
import pandas as pd
from sqlalchemy import create_engine
import cx_Oracle
conn_factory = lambda: conn_factory = lambda: cx_Oracle.connect(user=dbuser, password=dbpass, dsn=dsn)
engine = create_engine(
"oracle://",
creator=conn_factory
)
data = pd.read_sql("SELECT 1 FROM DUAL", engine)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.