Python实现将图片循环插入Oracle数据库
复盘解决出现的各种问题
需求:将一张图片循环插入Oracle数据库一万次(PS:向数据库中插入一万多张图片)
第一次搞这个,自己百度找到了两篇文章如下
Python实现将图片插入MySQL数据库
python循环插入数据
我的实现(最初):
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys import cx_Oracle from PIL import Image import os path = "D:\Download" # 读取图片文件 fp = open("D:\Download\测试.jpg",'rb') img = fp.read() fp.close() #建立一个Oracle连接 database = cx_Oracle.connect('test/[email protected]/test') #cx_Oracle.connect("用户名/密码@Oracle服务器IP/Oracle的SERVICE_NAME") #存入图片 #创建游标 cursor = database.cursor() # 注意使用Binary()函数来指定存储的是二进制 # for ID in range(1,10020): for ID in range(1,3): sql = "INSERT INTO V_A_DATA_RYZPXX_SLV_EXP VALUES (%s, %s, %s, %s, %s);" args = (ID, img,'2016-05-16 15:30:49','2016-05-16 16:07:56','0') cursor.execute(sql, args) database.commit() #关闭游标 cursor.close() #关闭数据库连接 database.close() print("===============") print("Done! ")
问题一:
python-cx_oracle报错"DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: "
这个问题出现的原因是我的python、服务器上Oracle客户端、cx_Oracle的版本不一致
(https://blog.csdn.net/qq_36227528/article/details/102758559完整说明)
然后我就查看我的软件的版本,我的python版本确定是3.6--64位的
在我的python安装目录里面:D:\Python\Python36\Lib\site-packages找到了cx_Oracle的版本
最后查看Oracle数据库的版本,因为我这个数据库在公司的服务器上,就用了navicat 连接Oracle数据库
SELECT * FROM v$version
三个版本都没问题,没办法就按照说明中的第四个解决
还是因为Oracle所有配置都在远程服务器上,我就自己下了一个windows一样版本的安装包
Oracle下载地址:https://www.oracle.com/database/technologies/instant-client/downloads.html
解压之后,把所有一dll结尾的文件都复制得到python的安装目录下面
再次执行出现了
问题二:
使用cx_Oracle库导入Oracle数据库的时候,出现了“ORA-01036: 非法的变量名/编号”的错误
解决方法是将sql中的传参占位符改为--(:1,:2,:3,:4,: 5)
sql = "INSERT INTO V_A_DATA_RYZPXX_SLV_EXP VALUES (:1,:2,:3,:4,:5);"
在执行出现
问题三:
cx_Oracle.DatabaseError: ORA-00911: invalid character---无效数据类型
百度之后要去掉sql 后面的 ;
sql = "INSERT INTO V_A_DATA_RYZPXX_SLV_EXP VALUES (:1,:2,:3,:4,:5)"
在执行出现
问题四:
cx_Oracle.DatabaseError: ORA-01861: literal does not match format string --字符串格式不匹配
如果直接按照字符串方式,或者,直接使用'2013-2-26 11:07:25',没有指定日期格式,就会报错
正确方法:
必须指定日期格式,如下:
to_date('2013-2-26 11:07:25' , 'yyyy-mm-dd hh24:mi:ss')
sql = "INSERT INTO V_A_DATA_RYZPXX_SLV_EXP VALUES (:1,:2,:3,:4,:5)"
args = (ID, img,'2016-05-16 15:30:49','2016-05-16 16:07:56','0')
需要怎么去修改---指定日期格式放到占位符里面,如下
sql = "INSERT INTO V_A_DATA_RYZPXX_SLV_EXP_CS VALUES (:1,:2,to_date(:3,'yyyy-mm-dd hh24:mi:ss'),to_date(:4,'yyyy-mm-dd hh24:mi:ss'),:5)"
成功
调试后完整代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
import cx_Oracle
from PIL import Image
import os
path = "D:\Download"
# 读取图片文件
fp = open("D:\Download\测试.jpg",'rb')
img = fp.read()
fp.close()
#建立一个Oracle连接
database = cx_Oracle.connect('test/[email protected]/test')
#cx_Oracle.connect("用户名/密码@Oracle服务器IP/Oracle的SERVICE_NAME")
#存入图片
#创建游标
cursor = database.cursor()
# 注意使用Binary()函数来指定存储的是二进制
for ID in range(1,11):
# sql = "INSERT INTO V_A_DATA_RYZPXX_SLV_EXP VALUES (%s, %s, %s, %s, %s);"
# sql = "INSERT INTO V_A_DATA_RYZPXX_SLV_EXP VALUES (: 1,:2,:3,:4,: 5)"
sql = "INSERT INTO V_A_DATA_RYZPXX_SLV_EXP_CS VALUES (:1,:2,to_date(:3,'yyyy-mm-dd hh24:mi:ss'),to_date(:4,'yyyy-mm-dd hh24:mi:ss'),:5)"
args = (ID, img,"2016-05-16 15:30:49","2016-05-16 16:07:56","0")
# args = (ID, img, "to_char('2016-05-16 15:30:49','yyyy-mm-dd hh24:mi:ss')", "to_char('2016-05-16 16:07:56','yyyy-mm-dd hh24:mi:ss')", '0')
# args = (ID, img, 'null', 'null', '0')
cursor.execute(sql, args)
# Cur.execute("insert into business_reconciliation_tbl(id,merchant_name,settle_money,is_del,state,merchant_id) values('%s','%s','%s','%s','%s','%s')" %(i, "test01","100","0","0","EFB8B43400D549EA919431AA85FEE0E4"))
# cursor.execute("insert into V_A_DATA_RYZPXX_SLV_EXP1(ID,ZPSJ,D_GXSJ,D_RKSJ,V_DEALFLAG) values('%s','%s','%s','%s','%s')" %(ID,img,"2016-05-16 15:30:49","2016-05-16 16:07:56","0"))
database.commit()
#关闭游标
cursor.close()
#关闭数据库连接
database.close()
print("===============")
print("Done! ")
在最开始调试还现了其他错误
如果发生ORA-01722错误,可能的原因有两种:
1)执行的sql语句中包含显示或者隐式的类型转换,将字符串转换到数字类型的时候失 败,(因为)字符内容包含非数字字符。解决方法:检查SQL语句是否包含对字段类型的转换。
2)将一个字符(varchar2)字段绑定(DefineByPos)到数字(number)类型,从而在取结果时,转换失败。解决方法:检查绑定变量和对应的字段是否顺序对应,数据类型对应。
异常原因:修改了某表,增加了一个字段,然后相关代码忘记修改,导致异常
一般insert语句省略了values前面的字段名,然后再新增字段后不修改代码就会导致此类问题
在解决问题的过程中查了很多资料
python连接oracle数据库几种方式
python+oracle
python-orm
Python环境配置:Anaconda+Pycharm+第三方库(安装及永久激活)(重点总结)
下面为同一个作者
Python3.6连接Oracle数据库的方法详解
Python使用cx_Oracle模块操作Oracle数据库详解
python cx_Oracle的基础使用方法(连接和增删改查)
Python连接Oracle之环境配置、实例代码及报错解决方法详解