- 孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数
- 孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数
- 孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用
- 孤荷凌寒自学python第五十八天成功使用python来连接上远
- 孤荷凌寒自学python第十八天python变量的作用范围
- 孤荷凌寒自学python第二十八天python的datetime
- 孤荷凌寒自学python第五十二天初次尝试使用python读取F
- 孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数
- 孤荷凌寒自学python第五十三天使用python写入和修改Fi
- 孤荷凌寒自学python第五十四天使用python来删除Fire
孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成
(完整学习过程屏幕记录视频地址在文末)
今天继续建构自感觉用起来顺手些的自定义模块和类的代码。
今天经过反复折腾,最终基本上算是比较好地完成了这个在同一数据库中复制数据表的函数,且同一函数支持目前研究的四种数据库(mysql,mssql,access,sqlite).
一、首先是到今天完成为止的_mdb.py文件中的全部内容:
#!/usr/bin/env
python3
# -*-
coding: utf-8 -*-
importpypyodbc
importpymysql
importpymssql
importsqlite3
importos.path
import_mty
mdbErrString='' #供其它模块使用的全局变量了,实时保存了各函数执行时的错误信息
def msgbox(info,titletext='孤荷凌寒的DB模块对话框QQ578652607',style=0,isShowErrMsg=False):
return_mty.msgboxGhlh(info,titletext,style,isShowErrMsg)
#连接网络数据库,目前支持mssql,mysql
def conNetdbGhlh(serveraddress,usr,pw,dbname,dbtype='mssql',isShowMsg=False):
'''
用于连接网络数据库,目前支持连接mssql,mysql两种网络关系型数据库,
dbtype可选形参默认值是操作mssql,如果要连接Mysql则通过此可选形参指定:为mysql
,此函数返回一个connect数据库连接对象
'''
globalmdbErrString
mdbErrString=''
try:
ifdbtype=='mssql':
con=pymssql.connect(serveraddress,usr,pw,dbname,charset='utf8')
returncon
elifdbtype=='mysql':
con=pymysql.connect(serveraddress,usr,pw,dbname)
returncon
else:
return None
except Exception ase:
mdbErrString='连接网络数据库【' + serveraddress + '】【' + dbname + '】时出错:' + str(e) + '\n此函数由【孤荷凌寒】创建,QQ578652607'
ifisShowMsg==True:
msgbox(mdbErrString)
return None
else:
pass
finally:
pass
#连接本地数据库文件,目前支持db,mdb,accdb,s3db
def conLocaldbGhlh(dbfilepath,strPass='',isShowMsg=False):
'''
连接本地数据库文件,目前支持mdb,accdb,以及sqlite数据库文件,识别方法是,如果有后缀mdb或accdb,则说明是access数据库文件,否则都认为是sqlite数据库文件。
如果连接成功,将返回一个con数据库连接对象
'''
globalmdbErrString
mdbErrString=''
try:
strhznm=_mty.getFilehzGhlh(dbfilepath)
ifstrhznm.find('mdb')>-1 orstrhznm.find('accdb')>-1:
#---连接access数据库----
ifstrPass=='':
strname='Driver={Microsoft
Access Driver (*.mdb, *.accdb)};DBQ='+ dbfilepath
else:
strname='Driver={Microsoft
Access Driver (*.mdb, *.accdb)};DBQ=' + dbfilepath + ';Pwd='+strPass
con=pypyodbc.connect(strname)
returncon
else:
#----连接sqlite数据库-----
con=sqlite3.connect(dbfilepath)
returncon
except Exception ase:
mdbErrString='连接网络数据库文件【' + dbfilepath + '】时出错:' + str(e) + '\n此函数由【孤荷凌寒】创建qq号是578652607'
ifisShowMsg==True:
msgbox(mdbErrString)
return None
else:
pass
finally:
pass
#删除数据库中的表
def delTableGhlh(con,strtablenm,isShowMsg=False):
'''
此方法将删除指定conn中的table,不管table中是否有数据,因此 操作要谨慎
,成功返回True 失败返回False
'''
globalmdbErrString
mdbErrString=''
try:
ifstrtablenm is not None andstrtablenm != '':
sql ='DROP TABLE '+strtablenm
cur=con.cursor()
cur.execute(sql)
con.commit()
cur.close()
ifisShowMsg==True:
msgbox('删除数据库表[{}]成功!'.format(strtablenm))
return True
else:
ifisShowMsg==True:
msgbox('the [{}] is
empty or equal None!'.format(sql))
return False
except Exception ase:
mdbErrString='删除数据库中表【' + strtablenm + '】时出错:' + str(e) + '\n此函数由【孤荷凌寒】创建qq号是578652607'
ifisShowMsg==True:
msgbox(mdbErrString)
return False
else:
pass
finally:
pass
#创建一个新表
def newTableGhlh(con,strTableNm,lstnm:'list. 将所有要新建的字段都放在一个列表中',lsttype,lstlength,dbtype='acc',lstNull=None,isDelExitsTable = False ,isAutoSetIDfieldAutoNumber=True,strSetFieldAutoNumberName='id',isShowMsg= False):
'''
传递有关表的每个字段的三大属性的分别的三个列表,
并可以指定此表的PRIMARY
key 字段,
及指定是否自动识别ID字段为PRIMARY key 字段,
如果要创建的表名是否存在,约定是否删除旧表
如果设置为不删除旧表,则放弃新建表;
'''
globalmdbErrString
mdbErrString=''
try:
cur=con.cursor()
dbtype=dbtype.lower()
ifdbtype=='access':
dbtype='acc'
except:
pass
#--------------------------------------------------------
try:
ifstrTableNm == "" or strTableNm.lower()
== "select" or strTableNm.lower()
== "from" or strTableNm.lower()
== "where" or strTableNm.lower()
== "order" or strTableNm.lower()
== "insert" or strTableNm.lower()
== "delete" or strTableNm.lower()
== "in" or strTableNm.lower()
== "with" or strTableNm.find("[") >-1 orstrTableNm.find("]") >-1:
mdbErrString ="要创建的数据表名为空或为不合法的保留关键字,请重新确认数据表名。" + '\n此函数由【孤荷凌寒】创建qq是578652607'
ifisShowMsg == True:
msgbox(mdbErrString)
return False
if len(lstnm)
!= len(lsttype) or len(lsttype)
!= len(lstlength):
mdbErrString ="在新建一个数据表时,接收到的四个关于表中字段属性的列表参数中元素总数不相同,无法执行。" + '\n此函数由【孤荷凌寒】创建qq号:578652607'
ifisShowMsg == True:
msgbox(mdbErrString)
return False
#现在先检查表是否存在,如果存在,根据设置是删除旧表然后新建表呢,还是保留旧表而不新建表
ifisTableExistGhlh(con,strTableNm,isShowMsg)==True:
#--如果旧表存在,就看是否要删除旧表---
ifisDelExitsTable==True:
ifdelTableGhlh(con,strTableNm,isShowMsg)==False:
#--旧表存在,但是却删除失败的情况----
mdbErrString ="在新建一个数据表时,因为同名的旧表已经存在了,但尝试删除旧表失败,所以无法新增一个表。" + '\n此函数由【孤荷凌寒】创建qq:578652607'
ifisShowMsg == True:
msgbox(mdbErrString)
return False
else:
#成功删除了旧表,那么就添加新表,直接顺序到后面执行代码即可。
pass
else:
#如果旧表存在,但又指定不删除旧表,那么只好结束 本函数 过程了
mdbErrString ="在新建一个数据表时,因为同名的旧表已经存在了,而又指定不能删除旧表,所以无法新增一个表。" + '\n此函数由【孤荷凌寒】创建qq是578652607'
ifisShowMsg == True:
msgbox(mdbErrString)
return False
#现在准备开始添加新的表-----
intC=len(lstnm)
rals=range(intC)
strR=""
strRls=""
strNm=""
strLs=""
intL=0
strL=""
strN=""
for i inrals:
strNm=lstnm[i]
strLs =lsttype[i]
strLs =getStandardFieldTypeGhlh(strLs,dbtype,isShowMsg)
strLs=' '+ strLs
#-----------------------
intL=lstlength[i]
ifintL<=0:
strL=''
else:
strL="(" + str(intL) +")"
#----------------
strN=""
if lstNull
!= None:
try:
strN=lstNull[i]
except:
pass
#---------------
if strN=="" or strN==None:
strN=""
else:
strN="
"+ strN
#----------
ifstrLs.find('NULL')>=0:
#-----如果已经在得到类别时,已经在字符串中出现了null关键字,此处就不要再处理了
strN=""
#---------------
ifdbtype!='mysql':
#上一条件式是因为,Mysql不允许在sql语句中出现 []括号
strNm='[' + strNm
+ ']'
strRls=strNm + strLs + strL + strN# 此时已经构建了类似于 【name
varchar(20)】 这样的内容了
#检查是否主键--
ifisAutoSetIDfieldAutoNumber==True:
#如果强制将字段名称为“id”的字段作为主键,则
ifstrNm.lower()==strSetFieldAutoNumberName.lower():
ifstrR.find("PRIMARY KEY")<0:
#上一条件式是为了避免有多个primary key
ifstrRls.find("PRIMARY KEY")<0:
#上一条件式是为了防止在取得可用字段类型时已添加过Primary key 了
strRls=strRls+"
PRIMARY KEY"
#现在拼合 strR
if strR=="":
strR=strRls
else:
strR=strR +","+strRls
#开始生成sql语句
strSql='CREATE TABLE ' +
strTableNm + '(' + strR + ');'
#运行--
cur.execute(strSql)
con.commit()#提交所作的修改
#如果没有出错,就返回成功
return True
[if !supportLineBreakNewLine]
[endif]
except Exception ase:
mdbErrString='尝试创建表【' + strTableNm + '】时出错:' + str(e) + '\n此函数由【孤荷凌寒】创建qq号是578652607'
ifisShowMsg==True:
msgbox(mdbErrString)
return False
else:
pass
finally:
try:
cur.close()
except:
pass
#判断一个表在数据库中是否存在
def isTableExistGhlh(con,strtablenm,isShowMsg=False):
'''
判断一张表是否在数据库中存在
,需要传入con数据库连接对象
'''
globalmdbErrString
mdbErrString=''
try:
cura=con.cursor()
returnisTableExist2Ghlh(cura,strtablenm,isShowMsg)
except Exception ase:
mdbErrString='检查表【' + strtablenm + '】是否存在时出错(此错误一般说明表不存在):' + str(e) + '\n此函数由【孤荷凌寒】创建qq号是578652607'
ifisShowMsg==True:
msgbox(mdbErrString)
return False
else:
pass
finally:
try:
cura.close
#pass
except:
pass
#判断一个表在数据库中是否存在2
def isTableExist2Ghlh(cur,strtablenm,isShowMsg=False):
'''
判断一张表是否在数据库中存在
,需要传入数据库操作指针对象
'''
globalmdbErrString
mdbErrString=''
try:
strsql='SELECT * FROM ' +
strtablenm + ';'
cur.execute(strsql)
return True
except Exception ase:
mdbErrString='检查表【' + strtablenm + '】是否存在时出错(此错误一般说明表不存在):' + str(e) + '\n此函数由【孤荷凌寒】创建qq号是578652607'
ifisShowMsg==True:
msgbox(mdbErrString)
return False
else:
pass
finally:
pass
(因今天笔记太长,超过简书的规定,未完,请看今天笔记的第二部分)
网友评论