2015-02-11 216 views
2

我能夠成功連接到sqlite數據庫並使用下面的命令集訪問特定的表。使用SQLALCHEMY連接到Oracle數據庫

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: <table name> 

我用下面的命令:

db = create_engine('oracle://username:[email protected]: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: There are multiple tables visible to the schema, you must specify owner 

你能否理解我究竟在哪裏出錯。

感謝,

羅希特

+0

嘗試傳遞'username。「表名」「而不是'表名」。我想在另一個架構中還有另一個具有相同名稱的表,該用戶也可以訪問該表。 – webKnjaZ 2015-02-12 17:28:49

回答

0

假設你有Oracle客戶端的機器有效的tnsnames.ora文件上,這個工作對我來說:

from sqlalchemy import create_engine 
import pandas as pd 
engine = create_engine('oracle://myusername:[email protected]') 
con = engine.connect() 
outpt = con.execute("SELECT * FROM YOUR_TABLE") 
df = pd.DataFrame(outpt.fetchall()) 
df.columns = outpt.keys() 
print(df.head()) 
con.close() 
2
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() 

它將啓用關閉連接。即使您有從本地端口到遠程數據庫的隧道,這也是有效的。