Python访问Oracle的两种数据获取方式

本文介绍了两种常用的SQL查询方法:一是利用cursor.fetchall()获取全部查询结果后进行迭代处理;二是通过反复调用cursor.fetchone()逐条读取记录,直至返回空。通过具体示例展示了这两种方法的应用及返回结果。
查询通常有两种方式:一种是使用cursor.fetchall()获取所有查询结果,然后再一行一行的迭代;另一种每次通过cursor.fetchone()获取一条记录,直到获取的结果为空为止。通过如下方式来验证这两种查询方式的区别:
TEST表内容如下:
(1, 'a', 'b', 'c')
(2, 'aa', 'bb', 'cc')
(3, 'aaa', 'bbb', 'ccc')



输出结果:

1, a, b, c
Number of rows returned: 3
2, aa, bb, cc
Number of rows returned: 3
3, aaa, bbb, ccc
Number of rows returned: 3
Number of rows returned: 3

Number of rows returned: 4
1, a, b, c
Number of rows returned: 5
2, aa, bb, cc
Number of rows returned: 6
3, aaa, bbb, ccc
Number of rows returned: 6
Number of rows returned: 6


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29067253/viewspace-2142314/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29067253/viewspace-2142314/

<think> 我们正在讨论Python安全连接Oracle数据库的方法。用户要求查找几种方法,因此我们需要提供多种安全连接方式,并确保这些方法符合安全标准,比如使用加密连接、避免明文密码等。 常见的Python连接Oracle数据库的库有cx_Oracle(现在称为python-oracledb),它是Oracle官方推荐的驱动程序。 安全连接通常需要考虑以下几点: 1. 使用加密传输(TLS)来保护数据传输。 2. 避免在代码中硬编码敏感信息(如密码),应使用环境变量或配置文件(并确保配置文件安全)或使用钱包(Oracle Wallet)等方式。 3. 使用正确的认证方式。 以下是几种安全连接的方法: 方法1:使用python-oracledb(原cx_Oracle)进行基础加密连接 - 安装:pip install oracledb - 在连接字符串中指定加密参数,或者通过配置sqlnet.ora文件(但通常我们可以在连接时指定参数) 方法2:使用Oracle Wallet存储凭证 - 这样可以避免在代码中直接出现用户名和密码。 - 连接时使用wallet_location参数。 方法3:使用操作系统认证(如Beq登录)或使用令牌认证(如OAuth 2.0) - 操作系统认证:使用本地操作系统的用户认证,但通常用于本地连接。 - OAuth 2.0:Oracle支持使用OAuth 2.0令牌进行认证。 方法4:使用连接池并确保连接字符串安全 此外,我们还需要注意,从安全角度,推荐使用最新版本的驱动程序,并保持更新。 下面给出两个示例: 示例1:使用python-oracledb进行加密连接(使用TLS) 示例2:使用Oracle Wallet连接 但由于在代码中直接写密码不安全,所以我们会展示如何从环境变量读取密码。 示例1:加密连接(使用TLS)并读取环境变量 首先,确保安装了oracledb: ```bash pip install oracledb ``` 代码示例: ```python import oracledb import os # 从环境变量获取用户名、密码和连接字符串 username = os.getenv("ORACLE_USER") password = os.getenv("ORACLE_PASSWORD") dsn = os.getenv("ORACLE_DSN") # 创建连接,默认情况下,oracledb会尝试使用加密连接(如果数据库配置了TLS) # 如果需要强制加密,可以配置ssl_context参数,或者使用thick模式并配置Oracle客户端的网络加密设置 connection = oracledb.connect(user=username, password=password, dsn=dsn) # 使用连接 cursor = connection.cursor() cursor.execute("SELECT * FROM dual") rows = cursor.fetchall() for row in rows: print(row) connection.close() ``` 示例2:使用Oracle Wallet(需要先配置好钱包) 配置钱包后,连接时可以省略用户名和密码: ```python import oracledb # 配置钱包位置(通常在环境变量TNS_ADMIN中设置) # 或者在连接时指定wallet_location参数 connection = oracledb.connect(dsn="your_dsn", wallet_location="/path/to/wallet", wallet_password="wallet_password") # 然后同上使用连接 ``` 注意:Oracle Wallet的配置相对复杂,需要先使用Oracle提供的工具(如mkstore)创建钱包并添加凭证。 另外,从安全角度,还可以使用连接池,这样避免频繁建立连接,同时也能够复用连接,减少密码在内存中的暴露次数。 示例3:使用连接池 ```python import oracledb import os username = os.getenv("ORACLE_USER") password = os.getenv("ORACLE_PASSWORD") dsn = os.getenv("ORACLE_DSN") # 创建连接池 pool = oracledb.create_pool(user=username, password=password, dsn=dsn, min=2, max=5, increment=1) # 从连接池获取连接 connection = pool.acquire() cursor = connection.cursor() cursor.execute("SELECT * FROM dual") rows = cursor.fetchall() for row in rows: print(row) # 归还连接到连接池 pool.release(connection) ``` 关于加密的配置,更详细的方式是使用`oracledb.ConnectParams`进行配置,例如强制使用TLS版本等。但通常,如果数据库配置了加密,客户端驱动默认会尝试使用加密连接。 此外,Oracle还支持使用JDBC样式的连接字符串指定加密参数,但在python-oracledb中,可以通过在dsn中指定,或者使用单独的加密参数。 例如,在dsn中指定加密: ``` dsn = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=your_host)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=your_service)))" ``` 或者使用ConnectParams: ```python import oracledb params = oracledb.ConnectParams() params.host = 'your_host' params.port = 1522 params.service_name = 'your_service' params.ssl_server_dn_match = True # 验证服务器证书 params.ssl_server_cert_dn = "server_dn" # 服务器证书的DN,用于验证 # 配置其他加密参数 connection = oracledb.connect(user="username", password="password", params=params) ``` 总结,安全连接的方式包括: 1. 加密传输(TLS/SSL) 2. 安全地存储凭证(使用钱包或外部凭证存储) 3. 使用连接池管理连接 4. 使用最新的驱动和加密协议 最后,我们生成相关问题: 1. 如何配置Oracle数据库以启用TLS加密? 2. 如何创建和使用Oracle Wallet? 3. Python中如何使用OAuth 2.0连接Oracle数据库? 4. 在Python中如何管理数据库连接的凭证安全? 注意:根据用户的问题,我们只提供Python连接Oracle的安全方法,所以相关问题应该围绕这个主题。 </think> ### Python安全连接Oracle数据库的几种方法 在Python中安全连接Oracle数据库需重点关注**加密传输**、**身份认证**和**凭证管理**三个方面。以下是推荐的几种方法: --- #### 方法1:使用官方`oracledb`库(原cx_Oracle) + TLS加密 ```python import oracledb import os # 从环境变量读取敏感信息 username = os.getenv("DB_USER") password = os.getenv("DB_PASSWORD") # 启用TLS加密配置 connection = oracledb.connect( user=username, password=password, dsn="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=your_host)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=your_service)))" ) cursor = connection.cursor() cursor.execute("SELECT * FROM dual") print(cursor.fetchone()) ``` **安全特性**: - TCPS协议强制加密传输[^1] - 通过环境变量避免硬编码凭证 - 支持证书验证(可添加`sserver_cert_dn`参数) --- #### 方法2:Oracle Wallet集成(免密码连接) ```python import oracledb connection = oracledb.connect( dsn="your_db_tns", wallet_location="/secure/path/to/wallet", wallet_password=os.getenv("WALLET_PWD") ) ``` **配置步骤**: 1. 使用`mkstore`创建钱包: ```bash mkstore -wrl /wallet/path -create mkstore -wrl /wallet/path -createCredential db_alias db_user db_password ``` 2. 在`sqlnet.ora`中配置: ``` WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /wallet/path))) SQLNET.AUTHENTICATION_SERVICES = (TCPS) ``` --- #### 方法3:私有端点 + IAM认证(云环境) ```python import oracledb connection = oracledb.connect( dsn="db_name_low", credential_type=oracledb.IAM, token="<OCI_IAM_TOKEN>" ) ``` **适用场景**: - Oracle Cloud Infrastructure (OCI) - 通过IAM令牌动态获取访问权限 - 需配合VPC私有端点使用 --- #### 方法4:Kerberos认证(企业级) ```python import oracledb connection = oracledb.connect( dsn="your_db", kerberos=True, service_name="primary/example.com@EXAMPLE.COM" ) ``` **前提条件**: - 配置`krb5.conf`文件 - 获取有效的Kerberos票据 - 数据库启用Kerberos认证 --- ### 安全增强建议 1. **最小权限原则**:为应用创建专用数据库账户,仅授予必要权限 2. **连接池审计**:使用`SessionPool`时启用`session_callback`审计日志 3. **证书轮换**:定期更新TLS证书(建议有效期≤90天) 4. **防注入机制**:始终使用参数化查询: ```python cursor.execute("SELECT * FROM users WHERE id = :id", [user_id]) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值