Python实现将图片循环插入Oracle

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实现将图片循环插入Oracle_第1张图片然后百度

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

 

Python实现将图片循环插入Oracle_第2张图片

三个版本都没问题,没办法就按照说明中的第四个解决

还是因为Oracle所有配置都在远程服务器上,我就自己下了一个windows一样版本的安装包

Oracle下载地址:https://www.oracle.com/database/technologies/instant-client/downloads.html

Python实现将图片循环插入Oracle_第3张图片

解压之后,把所有一dll结尾的文件都复制得到python的安装目录下面

Python实现将图片循环插入Oracle_第4张图片

再次执行出现了

 

问题二:

Python实现将图片循环插入Oracle_第5张图片

使用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);"

在执行出现

 

问题三:

Python实现将图片循环插入Oracle_第6张图片

cx_Oracle.DatabaseError: ORA-00911: invalid character---无效数据类型

百度之后要去掉sql 后面的 ;

sql = "INSERT INTO V_A_DATA_RYZPXX_SLV_EXP VALUES (:1,:2,:3,:4,:5)"

在执行出现

 

问题四:

Python实现将图片循环插入Oracle_第7张图片

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: invalid number (类型隐式转换--无效数字)

如果发生ORA-01722错误,可能的原因有两种:

1)执行的sql语句中包含显示或者隐式的类型转换,将字符串转换到数字类型的时候失 败,(因为)字符内容包含非数字字符。解决方法:检查SQL语句是否包含对字段类型的转换。

2)将一个字符(varchar2)字段绑定(DefineByPos)到数字(number)类型,从而在取结果时,转换失败。解决方法:检查绑定变量和对应的字段是否顺序对应,数据类型对应。

  • ORA-00947: not enough values

异常原因:修改了某表,增加了一个字段,然后相关代码忘记修改,导致异常

一般insert语句省略了values前面的字段名,然后再新增字段后不修改代码就会导致此类问题

 

在解决问题的过程中查了很多资料

python连接oracle数据库几种方式

python+oracle

python-orm

Python环境配置:Anaconda+Pycharm+第三方库(安装及永久激活)(重点总结)

下面为同一个作者

Python3.6连接Oracle数据库的方法详解

Python使用cx_Oracle模块操作Oracle数据库详解

python cx_Oracle的基础使用方法(连接和增删改查)

Python连接Oracle之环境配置、实例代码及报错解决方法详解

你可能感兴趣的:(Python)