Python使用cx_Oracle报错Ora-01036解决方案_南国

本文对比了MySql与Oracle数据库中使用占位符防止SQL注入的区别。在MySql中使用%s作为占位符,而在Oracle中则需要使用:1,:2等格式。文章通过实例展示了在不同数据库中正确使用占位符的方法。

最近项目又让写爬虫程序,这次用的MySql数据库,上次用的Oracle数据库,这次在爬取数据之后存库的时候并没有用之前的拼接sql进行存库,因为前一段学习Python视频的时候,视频里的老师说拼接的话存在sql注入问题,所以这次用了占位符%s,来防止sql注入

在填充的时候就会加引号了,写完之后意识到之前写的那个爬虫脚本也存在相同问题,然后改成占位符%s之后一直报错,百度了之后才知道,Oracle中占位符不可以用%s,需要用:1,:2来占位,以后遇到坑总结下,可能就印象深刻啦

顺便将之前的几篇爬虫总结下

简单爬虫Python+Oracle
简单爬取信息之BeautifulFly+MySql
用Request简单爬取英雄联盟所有皮肤
动态爬取flash数据,这篇有点难,F12看不到数据需要借助抓包工具
看不懂上一篇抓包工具charles的话,结合这一篇博客理解

最原先拼接的SQL:

 sql = "insert into PRODUCTPRICE(ID,NAME,PRICE,UNIT,AREA,INDATE) values ('" + str(uuid.uuid1()) + "','" + record["farmProduceName"] + "','" + str(record["averagePrice"]) + "','" + b + "','" + record["marketName"] + "','" + str(record["reportDate"]) + "')"

改成MySql占位符的SQL:

 sql = "insert into PRODUCTPRICE(ID,NAME,PRICE,UNIT,AREA,INDATE) VALUES (%s,%s,%s,%s,%s,%s)"

结果就出现了“ORA-01036: 非法的变量名/编号”的错误。

解决方法:
将传参的占位符改为“:1, :2, :3”,

改成Oracle的SQL

 sql = "insert into PRODUCTPRICE(ID,NAME,PRICE,UNIT,AREA,INDATE) VALUES (:1,:2,:3,:4,:5,:6)"

再次执行,问题解决。

不积小流,何以成江河

### 解决方案 ORA-00257 错误通常表示 Oracle 数据库中的存档日志空间不足,导致归档进程无法继续写入新的归档文件。此问题可能由多种原因引起,例如磁盘空间不足、LOG_ARCHIVE_DEST 参数配置不正确或目标路径不可访问。 以下是针对 Python 使用 `cx_Oracle` 连接时遇到 ORA-00257 的解决方案: #### 1. **检查磁盘空间** 确保用于存储归档日志的目标目录有足够的可用磁盘空间。可以通过以下 SQL 查询来查看当前使用的归档日志位置及其状态: ```sql SELECT DEST_NAME, STATUS FROM V$ARCHIVE_DEST; ``` 如果发现某个目的地的状态为 `ERROR` 或者显示为空间不足,则需要清理该目录下的旧归档日志文件或将它们移动到其他存储设备上[^1]。 #### 2. **调整归档模式设置** 确认数据库是否处于自动归档模式 (`ARCHIVELOG`) 下运行。如果不是,可以切换至手动管理模式以缓解压力: ```sql SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE NOARCHIVELOG; ALTER DATABASE OPEN; ``` 但是需要注意的是,在非归档模式下操作会丧失部分恢复能力,因此仅适用于开发环境测试阶段[^2]。 #### 3. **优化归档参数** 重新评估并修改与归档相关的初始化参数,比如增加最大允许的归档队列长度或者更改默认的目的地地址等。常用命令如下所示: ```sql ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=10 SCOPE=BOTH; -- 增加并发处理数 ALTER SYSTEM SET LOG_ARCHIVE_MIN_SUCCEED_DEST=1 SCOPE=BOTH; -- 设置最小成功目的数量 ``` 另外还可以考虑启用快速同步功能(Fast Sync),减少因网络延迟引发的问题几率[^2]。 #### 4. **监控及报警机制建立** 为了预防未来再次发生类似情况,建议部署一套完善的性能监测体系,及时捕获潜在风险信号并向管理员发出警告通知。利用第三方工具如 Nagios/Zabbix 结合自定义脚本实现自动化运维管理流程[^1]。 --- ### 示例代码片段 下面提供了一段简单的 Python 脚本来演示如何通过 `cx_Oracle` 库连接远程 Oracle 实例,并执行基本查询语句前先验证是否存在上述提到的相关错误条件。 ```python import cx_Oracle def check_archive_status(): try: dsn_tns = cx_Oracle.makedsn('hostname', 'port', service_name='service') conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns) cursor = conn.cursor() # Query to get archive log destinations status. sql_query = """ SELECT dest_id, status FROM v$log_dest WHERE type IN ('LOCAL','STANDBY'); """ result_set = cursor.execute(sql_query).fetchall() for row in result_set: print(f"Destination ID {row[0]} has Status={row[1]}") conn.close() except Exception as e: if str(e).find("ORA-00257") != -1: handle_archiver_error() else: raise def handle_archiver_error(): """Custom logic here when encountering ORA-00257.""" pass if __name__ == "__main__": check_archive_status() ``` 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值