- 孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用
- 孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数
- 孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数
- 孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用
- 孤荷凌寒自学python第二十九天python的datetime
- 孤荷凌寒自学python第五十九天尝试使用python来读访问远
- 孤荷凌寒自学python第三十九天python 的线程锁Lock
- 孤荷凌寒自学python第四十四天Python操作 数据库之准备
- 孤荷凌寒自学python第六十九天学习并实践beautifuls
- 孤荷凌寒自学python第五十二天初次尝试使用python读取F
孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数
(完整学习过程屏幕记录视频地址在文末,手写笔记在文末)
今天继续建构自感觉用起来顺手些的自定义模块和类的代码。
不同类型的关系数据库之间的数据表的结构与数据的互相复制操作相对比较复杂,虽然关系型数据库都通用SQL查询语句,经过过去多年的编程经验与前段时间Python操作数据库的学习,发现由于各家数据库在使用sql语句上的不同处理,事实上要统一为相同的互相可交换结构数据的形式,就是我想学习的
从今天的学习情况来看,已统一完成以下数据库部分表结构信息的处理:
(mysql,mssql,sqlite).
一、首先是最终完成了提取以上三种数据库的数据表的字段名称为一个列表对象成功:
```
#--此函数方法将返回一个表的所有字段名称字符串组成的列表对象
def getTableAllFieldToAListGhlh(cur,strtable,dbtype='acc',isShowMsg=False):
'''
此函数将返回指定的一个表中的所有字段名称组成的一个列表list对象,需要指定数据库类型;
(目前对access数据库没有办法获取相关信息)
cur:cursor指针对象;
strtable:表的名称;
dbtype:数据库类型;
isshowmsg:是否显示错误信息对话框;
'''
try:
lstR=[]
ifdbtype=='mssql':
cur.execute("Select
Name From SysColumns Where id=Object_Id('" + strtable + "')")
data=cur.fetchall
lstTemp=data()#data是一个函数方法,所以可以直接执行。
for i inlstTemp:
lstR.append(i[0]) #每一个i对象都是一个元组,因此要取出其中的第0个元素,就是字段名称
ifdbtype=='acc':
#access目前没法获取
#select name from
MSysObjects where type=1 and flags=0
#cur.execute("Select
* From " + strtable + ' where 1=2;')
#data=cur.fetchall
#lsttemp=data()
#msgbox(str(lsttemp))
pass
#-----------------------------------------------
ifdbtype=='sqlite':
cur.execute('PRAGMA
table_info(' + strtable + ')') #先取出源表的数据结构的一个列表
data=cur.fetchall()
#---下面将源表的创建语句还原成字符串
for i indata:
#取出字段列表----
lstR.append(i[1])
#----------------------------------------
ifdbtype=='mysql':
cur.execute("select
COLUMN_NAME from information_schema.COLUMNS where table_name = '" +
strtable + "';")
data=cur.fetchall()
for i indata:
lstR.append(i[0])
returnlstR
except Exception ase:
mdbErrString='尝试取出一张数据表中的所有字段名称并返回列表时出错:' + str(e) + '\n此函数由【孤荷凌寒】创建qq号是578652607'
ifisShowMsg==True:
msgbox(mdbErrString)
return None
else:
pass
finally:
pass
```
三种数据库取出的列表都是由指定数据表的字段名字符中组成的,字段顺序以数据表的默认顺序自然形成(后面取字段类型与字段长度均同一顺序,则不会混乱)
二、然后如法写了一个取出指定数据表字段类型描述字符串组成的列表的函数。
```
#此函数方法将返回一个表的所有字段类型字符串的列表
def getTableAllFieldTypeToAListGhlh(cur,strtable,dbtype='acc',isShowMsg=False):
'''
此函数将返回指定的一个表中的所有字段类型描述的字符串组成的一个列表list对象,需要指定数据库类型;
(目前对access数据库没有办法获取相关信息)
cur:cursor指针对象;
strtable:表的名称;
dbtype:数据库类型;
isshowmsg:是否显示错误信息对话框;
'''
try:
lstR=[]
strSql=""
strTemp=''
#------------------------------------------------------
ifdbtype=='mssql':
strSql=_cl.MSSQL_GHLH_SQL_GETTABLEALLINFO
strSql=strSql.replace('__tablenm__ghlh__',strtable)
#-----------------------------
cur.execute(strSql)
data=cur.fetchall
lstTemp=data()#此处的data是一个函数方法,所以可以直接执行。
for i inlstTemp:
lstR.append(i[7]) #每一个i对象都是一个元组,因此要取出其中的第7个元素,就是字段类型标识
ifdbtype=='acc':
#access目前没法获取
pass
#-------注意sqlite数据库取得的字段类型后面有(),里面有字段的长度信息---------------------------------
ifdbtype=='sqlite':
strSql=_cl.SQLITE_GHLH_SQL_GETTABLEALLINFO
strSql=strSql.replace('__tablenm__ghlh__',strtable)
#-----------------------------
cur.execute(strSql) #先取出源表的数据结构的一个列表
data=cur.fetchall()
#---下面将源表的创建语句还原成字符串
for i indata:
#取出字段类型----
strTemp=i[2]
#需要使用正则表达式取出除括号内容的部分,如果 不行,就返回 0
strTemp=_mre.getWithOutKuoHaoAndContentValue(strTemp,True,True,True)
lstR.append(strTemp)
#----------------------------------------
ifdbtype=='mysql':
cur.execute("select
DATA_TYPE from information_schema.COLUMNS where table_name = '" +
strtable + "';")
data=cur.fetchall()
for i indata:
lstR.append(i[0])
returnlstR
except Exception ase:
mdbErrString='尝试取出一张数据表中的所有字段数据类型并返回列表时出错:' + str(e) + '\n此函数由【孤荷凌寒】创建qq号是578652607'
ifisShowMsg==True:
msgbox(mdbErrString)
return None
else:
pass
finally:
pass
```
这样一来,三种不同数据库取出的对指定数据表的字段类型描述汇总而成的列表对象格式上是统一的,当然不同的数据库对字段数据类型的描述是不同的,但之前在创作一个【通用的创建新数据表】的函数时已解决了类型描述字符串的在四种数据库类型之间的相互转换问题。因此这样的列表也就可以在各种数据库之间被识别了。
同时由于sqlite数据库取出的字段类型描述字符串同时后面用()标注了字段 的长度,形式是这样的:
int(4)
int表示了字段的类型
而括号中的4表明了字段的数据长度。
而如果要统一不同数据库取出的字段类型描述列表的格式,则只需要前面的字段类型部分的字符串,于是又对【正则表达式】进行了了解,并生成了对应的函数以取出想要的部分内容。
此处已经用到的函数是:
_mre.getWithOutKuoHaoAndContentValue
_mre是我自己字义的专门处理正则表达式的py文件。具体函数代码会在本笔记最后贴出。
三、最后如法写了一个取出指定数据表字段长度描述整数组成的列表的函数。
```
#此函数方法将返回一个表的所有字段类型长度的数字组成的列表
def getTableAllFieldLengthToAListGhlh(cur,strtable,dbtype='acc',isShowMsg=False):
'''
此函数将返回指定的一个表中的所有字段字段类型长度的组成的一个列表list对象,需要指定数据库类型;
(目前对access数据库没有办法获取相关信息)
cur:cursor指针对象;
strtable:表的名称;
dbtype:数据库类型;
isshowmsg:是否显示错误信息对话框;
'''
try:
lstR=[]
strSql=""
strTemp=""
#---------有些字段如account类型字段不需要字段长度,有些字段类型长度过大也不要,将强制修改为0,需要 后续处理-------------------------------------
ifdbtype=='mssql':
strSql=_cl.MSSQL_GHLH_SQL_GETTABLEALLINFO
strSql=strSql.replace('__tablenm__ghlh__',strtable)
#-----------------------------
cur.execute(strSql)
data=cur.fetchall
lstTemp=data()#此处的data是一个函数方法,所以可以直接执行。
for i inlstTemp:
ntemp=i[9] #每一个i对象都是一个元组,因此要取出其中的第9个元素,就是字段的长度,而8位是字段的精度
if i[9]>10000: #数值过大,说明 就是不需要指定大小 的字段,设置为0
ntemp=0
lstR.append(ntemp)
ifdbtype=='acc':
#access目前没法获取
pass
#--------下面的代码与取出字段类型的代码相同,只能在每个字段类型后的括号中取出字段长度---------
ifdbtype=='sqlite':
strSql=_cl.SQLITE_GHLH_SQL_GETTABLEALLINFO
strSql=strSql.replace('__tablenm__ghlh__',strtable)
#-----------------------------
cur.execute(strSql) #先取出源表的数据结构的一个列表
data=cur.fetchall()
for i indata:
#取出字段类型----
strTemp=i[2]
#需要使用正则表达式取出括号中的部分,如果 不行,就返回 0
strTemp=_mre.getKuoHaoAndContentValue(strTemp,True,False,False)
#最后再添加==========
ifstrTemp=='':
strTemp='0'
ifstrTemp.isdigit()==False:
strTemp='0'
lstR.append(int(strTemp))
#---------没有指定长度的会返回NULL,需要进行转换-------------------------------
ifdbtype=='mysql':
cur.execute("select
CHARACTER_MAXIMUM_LENGTH from information_schema.COLUMNS where table_name =
'" + strtable + "';")
data=cur.fetchall()
for i indata:
nT=i[0]
ntemp=i[0]
if ntemp==None:
nT=0
lstR.append(nT)
returnlstR
except Exception ase:
mdbErrString='尝试取出一张数据表中的所有字段数据类型并返回列表时出错:' + str(e) + '\n此函数由【孤荷凌寒】创建qq号是578652607'
ifisShowMsg==True:
msgbox(mdbErrString)
return None
else:
pass
finally:
pass
```
这个函数还没有完善,因为部分字段类型(如自增加计数型的字段类型)可能不需要指定字段数据长度限制,还没有处理得很好。
但基本上统一了不同数据库取出的字段数据长度限制的描述,并将所有列表中的元素都统一为整数数字,方便统一处理和识别。
此处又用到了今天自定义的另一个正则表达式函数:
_mre.getKuoHaoAndContentValue
具体函数代码会在本笔记最后贴出。
四、今天完成后的_mdb.py文件的内容如下:
```
#!/usr/bin/env
python3
# -*-
coding: utf-8 -*-
importstring
importpypyodbc
importpymysql
importpymssql
importsqlite3
importos.path
import_mty
import _cl #常用常量模块
import_mre
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
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
#将各种复杂的对数据库类型的描述,如3,8等数值表示的字段类型与,windows系统中的system.string,之类的描述,统一修改为数据库能够在定义字段类型时直接使用的描述字符串
def getStandardFieldTypeGhlh(strin,dbtype='acc',isShowMsg=False):
'''
将各种复杂的对数据库类型的描述,如3,8等数值表示的字段类型与,windows系统中的system.string,之类的描述,统一修改为数据库能够在定义字段类型时直接使用的描述字符串
'''
globalmdbErrString
mdbErrString=''
strI=""
try:
strI=str(strin)
strI.lower()
strI=strI.replace('system.','') #windows系统中,以及其它一些语言中对数据类型的描述的字符串中,可以包含有system.前缀
strI=strI.replace('.','') #去掉多余的点
dbtype=dbtype.lower()
ifdbtype=='access':
dbtype='acc'
except:
pass
#--------------------------------------------------------
try:
if strI=='':
mdbErrString ="因为传入的要识别的数据库的字段类型为空,因此无法识别,只能识别成【文本类型】【text】。" + '\n此函数由【孤荷凌寒】创建qq:578652607'
ifisShowMsg == True:
msgbox(mdbErrString)
ifdbtype!='acc' and dbtype!='mysql':
return 'ntext'
else:
return 'text'
#---正式识别开始---------------------
if strI in ("int32", "3", "int","int16", "integer", "long","smallint","tinyint","mediumint"):
ifdbtype=='acc':
return 'long'
else:
return "int" #多数数据库在这种情况下要额外指定长度
#----------------------
if strI=='bigint':
ifdbtype=='acc' or dbtype=='sqlite':
return 'int'
else:
return 'bigint'
#-----------------
elif strI in ("memo","longtext","mediumtext"):
ifdbtype=='acc':
return "memo"
elifdbtype=='mysql':
return "longtext"
else:
return 'ntext'
#------------------
elif strI in ("str","string","8","varchar","char","text","nvarchar","tinytext"):
ifdbtype=='mysql' or dbtype=='acc':
return "varchar" #在这种情况下都需要指定长度
else:
return "nvarchar" #在这种情况下都需要指定长度
#------------------
elif strI in ("datetime","7"):
ifdbtype=='sqlite':
return "date"
else:
return "datetime"
#----------------
elif strI=="date":
ifdbtype!='acc':
return "date"
else:
return "datetime"
#-----------------
elif strI=="time":
ifdbtype!='acc':
return "time"
else:
return "datetime"
#-----------------
elif strI in ("single", "4", "real"):
return "real"
#----------------
elif strI in ("double", "5", "float"):
return "float"
#----------------
elif strI in ("boolean", "11", "bit","bool"):
ifdbtype=='mssql' or dbtype=='acc':
return "bit"
else:
return 'boolean'
#-----------------
elif strI in ("byte[]", "8209", "image", "binary", "ole","blob"):
#---image为微软专用的OLE,"Binary"为 二进制,在sqlite中使用blob,表示二进制大数据
ifdbtype=='acc' or dbtype=='mssql':
return "Image"
elifdbtype=='sqlite':
return 'blob'
else:
return 'binary'
#-------这是真正的全精度数据
elif strI in ("decimal", "14", "money","numeric"):
ifdbtype=='sqlite':
return 'numeric'
elifdbtype=='acc':
return 'money'
else:
return 'decimal'
#--------------
elif strI=="timestamp":
ifdbtype=='acc':
return 'double'
else:
return 'timestamp'
#------自动编号------
elif strI in ("auto", "autocount", "autonumber", "autono", "autoincrement","auto_increment"):
ifdbtype=='mysql':
return 'int NOT
NULL auto_increment'
elifdbtype=='acc':
return 'counter
NOT NULL PRIMARY KEY'
elifdbtype=='mssql':
return 'int
identity(1,1)'
else:
#--sqlite-----------------
return "integer
PRIMARY KEY AUTOINCREMENT NOT NULL"
#--------
else:
#其余情况,全部识别为 text
ifdbtype!='acc' and dbtype!='mysql':
return 'ntext'
else:
return 'text'
except Exception ase:
mdbErrString='尝试将各种不同的对数据库字段类型的描述转换为标准字段类型描述时出错:' + str(e) + '\n此函数由【孤荷凌寒】创建qq号是578652607'
ifisShowMsg==True:
msgbox(mdbErrString)
#------------------------------------------
ifdbtype!='acc' and dbtype!='mysql':
return 'ntext'
else:
return 'text'
else:
pass
finally:
pass
```
(因篇幅太长,超过简书限制,被截成两部分,以下内容请继续看第二部分代码 )
网友评论