SQLAlchemy를 사용하여 Oracle 데이터베이스에 연결
아래 명령 집합을 사용하여 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)
다음 오류가 발생합니다.
어설션 오류:스키마에 표시되는 테이블이 여러 개이므로 소유자를 지정해야 합니다.
제가 정확히 어디서 잘못되고 있는지 설명해 주시겠습니까?
더 이상 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()
연결을 닫을 수 있습니다.로컬 포트에서 원격 DB로의 터널이 있는 경우에도 작동합니다.
시스템에 유효한 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()
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)
이건 내게 효과가 있어요, 없을 때요.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.그렇게
다음과 같이 앱을 실행합니다.
내보내기 LD_LIBRARY_PATH=syslog-instantclient/instantclient_21_1 python main.파이의
여기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은 세미콜론을 좋아하지 않습니다.
언급URL : https://stackoverflow.com/questions/28453545/connecting-to-an-oracle-database-using-sqlalchemy
'source' 카테고리의 다른 글
MongoDB의 배열에 중첩된 하위 문서 제거 (0) | 2023.06.23 |
---|---|
.다른 공용 키 토큰을 사용하는 Net 어셈블리 바인딩 리디렉션 (0) | 2023.06.23 |
C NULL이 C++11 Nullptr과 같습니까? (0) | 2023.06.23 |
열 값을 기준으로 참/거짓을 선택하는 방법은 무엇입니까? (0) | 2023.06.23 |
$209 달러 몽고드의 $프로젝트 (0) | 2023.06.23 |