使用sqlalchemy和oracledb连接Python与Oracle

0 投票
1 回答
58 浏览
提问于 2025-04-14 17:12

我需要用Python连接Oracle数据库,并且要使用SQLAlchemy。我需要用到oracledb这个包。

我参考了来自Github的代码。

import os
import oracledb
from sqlalchemy import create_engine
from sqlalchemy import text

print (oracledb.__file__)

username = os.environ.get("PYTHON_USERNAME")
password = os.environ.get("PYTHON_PASSWORD")

cp = oracledb.ConnectParams()
cp.parse_connect_string(os.environ.get("PYTHON_CONNECTSTRING"))

thick_mode = None

engine = create_engine(
    f'oracle+oracledb://{username}:{password}@{cp.host}:{cp.port}/?service_name={cp.service_name}',
    thick_mode=thick_mode)

stmt = 'SELECT UNIQUE CLIENT_DRIVER FROM V$SESSION_CONNECT_INFO WHERE SID = SYS_CONTEXT(''USERENV'', ''SID'')'
with engine.connect() as connection:
    print(connection.scalar(text(stmt)))

.env文件里包含了以下内容:

PYTHON_USERNAME="scott"
PYTHON_PASSWORD="tiger"
PYTHON_CONNECTSTRING="192.168.1.3:1521/orclpdb"

我看到的错误信息如下:

C:\Users\HI>C:\Users\HI\AppData\Local\Programs\Python\Python312\python.exe "C:\Users\HI\Desktop\New folder\streamlit\langchain\sa-pydb.py"
C:\Users\HI\AppData\Local\Programs\Python\Python312\Lib\site-packages\oracledb\__init__.py
Traceback (most recent call last):
  File "C:\Users\HI\Desktop\New folder\streamlit\langchain\sa-pydb.py", line 13, in <module>
    cp.parse_connect_string(os.environ.get("PYTHON_CONNECTSTRING"))
  File "C:\Users\HI\AppData\Local\Programs\Python\Python312\Lib\site-packages\oracledb\connect_params.py", line 666, in parse_connect_string
    self._impl.parse_connect_string(connect_string)
  File "src\\oracledb\\impl/base/connect_params.pyx", line 551, in oracledb.base_impl.ConnectParamsImpl.parse_connect_string
TypeError: descriptor 'strip' for 'str' objects doesn't apply to a 'NoneType' object

下面是这些包的版本信息。

C:\Users\HI>pip show sqlalchemy
Name: SQLAlchemy
Version: 2.0.28

C:\Users\HI>pip show oracledb
Name: oracledb
Version: 2.0.1

有什么可能的解决方案吗?

1 个回答

1

你遇到的问题是环境变量 PYTHON_CONNECT_STRING 没有设置好。因此你得到的值是 None,这个值在调用 cp.parse_connect_string() 时是无法使用的。你可以用下面的代码来确认这一点:

cp = oracledb.ConnectParams()
cp.parse_connect_string(os.environ["PYTHON_CONNECTSTRING"])

你应该会看到一个 KeyError 的错误提示。你使用的其他方法应该是可以正常工作的!

撰写回答