【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
- 写在最前面
- 1. 环境准备
- 2. 下载Oracle JDBC驱动
- 3. 安装Oracle JDBC驱动
- 4. 编写Python代码连接数据库
- 5. 如果表太大,可以执行一个简单且返回结果较少的查询
- 1. 查询前几行数据
- 2. 查询表的元数据
- 3. 使用`count`函数,查看表总行数
- 4. 法2查询表的行数
- 5. 检查表的存在性
- 6. 使用描述表结构
- 7. 异常处理
- 6. 注意事项和调试
写在最前面
没有找到合适的参考链接,在gpt的协作下一步完成了这份指南。欢迎交流 ~
在Python项目中,如果你的目标是通过JDBC连接到位于Linux远程服务器上的Oracle数据库,你可以选择使用第三方库如JayDeBeApi
,它提供了一个在Python中使用JDBC驱动连接数据库的接口。
还可以使用Oracle的官方库cx_Oracle
来进行这种操作,但是不在本篇指南的范围内。
服务器相关配置文章:
【服务器】服务器上后台运行python程序
【服务器】ssh本机连接服务器失败
【pycharm】在本地利用远程服务器显卡跑代码
【服务器】服务器中的conda环境
下面是需要通过JDBC来连接的一步一步的指导:
1. 环境准备
首先,确保你的Python环境已经安装了JayDeBeApi
和JPype1
库,这两个库是使用JDBC的关键。如果未安装,可以通过pip进行安装:
pip install JayDeBeApi JPype1
然后,你需要确认你的系统中安装的Java版本,因为Oracle的JDBC驱动依赖于特定版本的Java。你可以通过命令行输入以下命令来检查Java版本:
java -version
这会显示你的Java版本信息。根据这个版本信息,你可以选择合适的JDBC驱动。
2. 下载Oracle JDBC驱动
- Oracle JDBC驱动可以从Oracle官网下载。你需要下载对应版本的JDBC驱动(通常是一个
.jar
文件)。 - 根据你的Oracle数据库版本和Java版本选择合适的JDBC驱动。例如,如果你使用的是Oracle Database 12c和Java 8,你应该下载ojdbc8.jar。
- 通常需要Oracle账号来下载这些文件。如果你没有账号,你可能需要先注册一个。
下载链接通常可以在Oracle官网上找到,或者如果你已经有了数据库的安装,JDBC驱动可能已经包含在其中。
3. 安装Oracle JDBC驱动
在Linux环境中,你可以通过以下步骤来安装JDBC驱动:
a. 上传JDBC驱动
将下载的.jar文件上传到你的Linux服务器上,可以选择一个合适的目录来存放这个文件,例如/opt/jdbc_drivers/。并且更改权限,添加执行权限。
b. 确保Python能访问这个JDBC驱动
你需要在Python代码中指定这个.jar文件的路径,以便JayDeBeApi库能够加载它。
4. 编写Python代码连接数据库
一旦你有了JDBC驱动,就可以使用下面的Python代码示例来连接你的Oracle数据库。你需要修改数据库的URL、用户名和密码来匹配你的具体配置。
import jaydebeapi# Oracle数据库JDBC连接字符串# 格式: jdbc:oracle:thin:@host:port:SID# connection_string = "jdbc:oracle:thin:@your_linux_server_ip:1521:your_sid"# 这里最后一个我同/跑通的代码,不清楚原理connection_string = "jdbc:oracle:thin:@your_linux_server_ip:1521/our_sid"# Oracle JDBC驱动路径,刚刚我们放到的位置driver_path = "/path/to/ojdbc8.jar"# 驱动类名driver_class = "oracle.jdbc.driver.OracleDriver"# 数据库用户名和密码username = "your_username"password = "your_password"# 连接数据库conn = jaydebeapi.connect(driver_class, connection_string, [username, password], jars=driver_path)# 创建游标对象cursor = conn.cursor()# 执行查询,需要修改为你自己的表名cursor.execute("SELECT * FROM your_table")# 获取查询结果result = cursor.fetchall()# 打印结果for row in result: print(row)# 关闭游标和连接cursor.close()conn.close()
5. 如果表太大,可以执行一个简单且返回结果较少的查询
要快速确认是否能成功连接到数据库并读取表数据,你可以执行一个简单且返回结果较少的查询。通常,一个有效的方式是查询表中的前几行,或者查询表的元数据。以下是几种方法,你可以根据具体情况选择使用:
1. 查询前几行数据
这是最直接的方法,可以快速查看表中的数据是否能被正确读取。
cursor.execute("SELECT * FROM actual_table_name FETCH FIRST 5 ROWS ONLY") # 适用于Oracle 12c及以上版本result = cursor.fetchall()for row in result: print(row)
如果你的Oracle版本低于12c,可以使用ROWNUM
:
cursor.execute("SELECT * FROM actual_table_name WHERE ROWNUM <= 5")result = cursor.fetchall()for row in result: print(row)
2. 查询表的元数据
这种方法不需要读取实际的数据行,而是检查表的结构,如列名和数据类型。这对于确认连接和权限通常也足够。
cursor.execute("SELECT column_name, data_type FROM user_tab_columns WHERE table_name = 'ACTUAL_TABLE_NAME'")result = cursor.fetchall()for column in result: print(column)
确保'ACTUAL_TABLE_NAME'
是大写的,因为Oracle中的表名在元数据中通常是大写的。
3. 使用count
函数,查看表总行数
如果你只是想确认表中是否有数据,而不需要查看具体内容,可以使用count
函数:
cursor.execute("SELECT COUNT(*) FROM actual_table_name")result = cursor.fetchone()print("Number of rows in the table:", result[0])
这将返回表中的总行数,是检查表是否可访问的快速方法。
要快速确认Python脚本通过JDBC能否成功读取Oracle数据库中的表,你可以优化你的SQL查询,以便更快地获取输出结果。以下是一些可以帮助你快速验证数据库连接和读取能力的方法:
4. 法2查询表的行数
执行一个查询以返回表中的行数,这可以迅速告诉你表是否可访问并且包含数据,同时不需要加载大量数据。
cursor.execute("SELECT COUNT(*) FROM actual_table_name")count = cursor.fetchone()print("Number of rows:", count[0])
这个查询非常快,因为它不需要检索大量数据,只返回一个数字。
5. 检查表的存在性
你也可以检查一个表是否存在于数据库中,这不需要读取任何数据行,只是确认表的存在性。
cursor.execute("""SELECT table_name FROM user_tables WHERE table_name = 'ACTUAL_TABLE_NAME'""")result = cursor.fetchone()if result: print("Table exists.")else: print("Table does not exist.")
确保将'ACTUAL_TABLE_NAME'
替换为你实际的表名,并保持大写,因为Oracle通常以大写存储表名。
6. 使用描述表结构
在Python中使用jaydebeapi
库连接到数据库时,你可以通过游标对象的description
属性来获取结果集的列名。这个属性提供了关于每一列的一些基本信息,其中第一个元素就是列名。
cursor.execute("SELECT * FROM exam_ct_report FETCH FIRST 5 ROWS ONLY") # 适用于Oracle 12c及以上版本result = cursor.fetchall()for row in result: print(row)# 输出列名column_names = [desc[0] for desc in cursor.description]print("Column names:", column_names)
在这个例子中,cursor.description
是一个包含多个元组的列表,每个元组描述一个字段。每个元组的第一个元素是字段名,这正是我们需要的。因此,通过列表推导式[desc[0] for desc in cursor.description]
,我们可以提取出所有的列名。
7. 异常处理
在执行这些查询时,加入异常处理可以帮助你更好地理解在连接或查询过程中可能发生的任何错误:
try: cursor.execute("SELECT * FROM actual_table_name WHERE ROWNUM <= 5") result = cursor.fetchall() if result: for row in result: print(row) else: print("No data found in the table.")except Exception as e: print("Error:", e)finally: if cursor: cursor.close() if conn: conn.close()
通过使用上述任一方法,你可以快速有效地确认你的数据库连接是否正常,以及是否有权限读取指定的表。这些方法都适用于快速检查和初步调试。
6. 注意事项和调试
- 确保Linux服务器的防火墙和Oracle数据库配置允许远程连接。
- 检查Oracle侦听器是否运行在指定的端口,并且数据库实例(SID)是正确的。
- 如果遇到连接问题,检查Oracle数据库的日志以及Python输出的错误信息,这些通常可以提供问题的线索。
通过上述步骤,你应该能够成功使用Python和JDBC连接到Linux服务器上的Oracle数据库。这种方式虽不如使用cx_Oracle
直接和Python集成那样常见,但它在某些特定场景下(例如需要使用JDBC的特定功能)非常有用。如果你有任何具体的错误或问题,可以提供更多的信息,我可以帮助你进一步调试。
欢迎大家添加好友,持续发放粉丝福利!