美文网首页学习永远无止境手写笔记
孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数

孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数

作者: f9e86c58f23c | 来源:发表于2018-12-25 21:20 被阅读20次

孤荷凌寒自学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

(因今天笔记太长,超过简书的规定,未完,请看今天笔记的第二部分)

相关文章

网友评论

    本文标题:孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数

    本文链接:https://www.haomeiwen.com/subject/chpqlqtx.html