我正在使用cx_Oracle在Python中建立与Oracle数据库的连接。我正在使用钱包连接数据库。代码在虚拟环境中运行。当我激活虚拟环境并手动运行脚本时,它运行得很好。但当运行窗体crontab或Tidal(一个调度程序(时,它会抛出以下错误:
cx_Oracle.DatabaseError: ORA-12578: TNS:wallet open failed
之前我还面临另一个类似的问题:
cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so"
-手动运行可以很好地工作,但crontab会出现错误,这是通过包含此答案中的建议行来解决的。
下面是cronjob:
0 6 * * * cd /path/to/the/code && /path/to/the/venv/myEnv/bin/python /path/script.py
以下是代码:
#!/usr/bin/env python3
import os
import cx_Oracle
os.environ["ORACLE_HOME"]="/u01/app/oracle/product/12.2.0/client64"
def fetch_data():
#connection = cx_Oracle.connect("user", "pwd", "conn")
connection = cx_Oracle.connect(dsn="WALLET_NAME", encoding="UTF-8")
cursor = connection.cursor()
with open('rtp_query.sql') as f:
sql = f.read()
cursor.execute(sql)
result = cursor.fetchall()
cursor.close()
connection.close()
请注意,username/pwd连接是通过命令行和crontab进行的,但对于Wallet字符串,它只能在命令行中工作,并为crontab抛出以下错误:
cx_Oracle.DatabaseError: ORA-12578: TNS:wallet open failed
对我们有帮助的是扩大了对oracle钱包文件的权限。找到您的oracle钱包文件并执行"chmod 750*wallet*",以便同一用户组的其他用户可以读取这些文件。