使用SQLALCHEMY连接到Oracle数据库

roh*_*nha 10 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)
Run Code Online (Sandbox Code Playgroud)

我可以使用cx_Oracle库从oracle数据库中获取数据.

但是,当我尝试连接到sqlalchemy中的Oracle数据库时,我收到以下错误

NoSuchTableError: <table name>
Run Code Online (Sandbox Code Playgroud)

我使用了以下命令:

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')
Run Code Online (Sandbox Code Playgroud)

当我使用以下命令

t= Table('table name', md, autoload=True,oracle_resolve_synonyms=True)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

AssertionError: There are multiple tables visible to the schema, you must specify owner
Run Code Online (Sandbox Code Playgroud)

能否请您理解我哪里错了.

谢谢,

罗希特

小智 14

您不再需要导入 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)
Run Code Online (Sandbox Code Playgroud)

  • 知道为什么我不断收到诸如“NoSuchModuleError:无法加载插件:sqlalchemy.dialects:oracle.cx_oracle”之类的错误吗? (2认同)

小智 7

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
Run Code Online (Sandbox Code Playgroud)

这对我有用.也可以创建一个连接对象

conn = engine.connect()
conn.close()
Run Code Online (Sandbox Code Playgroud)

这将使关闭连接.即使您从本地端口到远程数据库的隧道,这也可以工作.

  • 与在 `cstr` 中使用连接字符串不同,我更愿意从 `sqlalchemy.engine.url.URL("oracle", user, password, sid)` 构建它 (2认同)

小智 6

假设你的机器上有一个带有有效 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() 
Run Code Online (Sandbox Code Playgroud)