我想设置一个 oracledb 作为数据源,但无法获取语法。这可能吗?
import oracledb
from sqlalchemy import create_engine
import getpass
username = getpass.getuser()
userpwd = getpass.getpass()
dsn="my_server"
# connect to oracle database
connection=oracledb.connect(
user=username,
password=userpwd,
dsn=dsn
)
# create engine
engine = create_engine('oracle+oracledb://', creator=lambda: connection)
连接并传递到例如 pandas.read_sql 是成功的。
但是我想用gx:
import great_expectations as gx
context = gx.get_context()
context.sources.add...?
我尝试获取连接字符串
cp = oracledb.ConnectParams(user=username, password=userpwd,host=dsn)
conn_string = cp.get_connect_string()
datasource = context.sources.add_sql(
name="my_datasource", connection_string=conn_string
)
但这行不通
TestConnectionError:尝试连接到数据源失败, 以下错误消息:由于以下原因无法创建 SQLAlchemy 引擎 出现以下异常:无法从字符串中解析 SQLAlchemy URL '(描述=(地址=(协议= tcp)(主机= myserver)(端口= 1521)))'
有什么想法吗?
这为我创建了一个数据源:
import getpass
import os
import oracledb
import great_expectations as gx
un = os.environ.get('PYTHON_USERNAME')
cs = os.environ.get('PYTHON_CONNECTSTRING')
pw = getpass.getpass(f'Enter password for {un}@{cs}: ')
# I use Easy Connect strings like "localhost/orclpdb1". These two lines
# let me access the components individually
cp = oracledb.ConnectParams()
cp.parse_connect_string(cs)
connection_string = f'oracle+oracledb://{un}:{pw}@{cp.host}:{cp.port}/?service_name={cp.service_name}'
context = gx.get_context()
datasource = context.sources.add_sql(
name="my_datasource", connection_string=connection_string
)
asset_name = "my_query_asset"
query = "select * from employees"
query_asset = datasource.add_query_asset(name=asset_name, query=query)
for i in query_asset:
print(i)
运行它会给出:
('name', 'my_query_asset')
('type', 'query')
('id', None)
('order_by', [])
('batch_metadata', {})
('splitter', None)
('query', 'select * from employees')
有关将 oracledb 与 SQLAlchemy 连接的信息,请参阅将 SQLAlchemy 2.0 与 python-oracledb 用于 Oracle 数据库。