2015-02-11 2 views
2

Я могу успешно подключиться к базе данных sqlite и получить доступ к конкретной таблице, используя набор команд ниже.Подключиться к базе данных Oracle, используя SQLALCHEMY

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, я получаю следующее сообщение об ошибке

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 

Не могли бы вы понять, где именно я ошибаюсь.

Спасибо,

Rohit

+0

Попробуйте пропустить имя пользователя ".name" вместо "имя таблицы". Я предполагаю, что есть другая таблица с тем же именем в другой схеме, которая также доступна этому пользователю. – webKnjaZ

ответ

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() 

, который позволит закрыть соединение. Это работает, даже если у вас есть туннель для удаленного БД из вашего локального порта.

Смежные вопросы