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

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

作者: f9e86c58f23c | 来源:发表于2018-12-24 22:04 被阅读11次

    #-----复制表的操作----------------

    def copyDbTableGhlh(con,strst,strtt,dbtype='acc',strfieldlist='*',strprimarykey='id',strprimarykey2='',isstrprimarykeyautoaccount=False,isstrprimarykey2autoaccount=False,strprimarykeytype='integer',strprimarykey2type='str',iscopydata=False,isShowMsg=False):

        try:

            cur=con.cursor()

            strLs=strtt

            ifdbtype!='mysql': #mysql 不支持在sql语句中书写方括号

                strst='[' + strst

    + ']'

                strtt='[' + strtt

    + ']'

            strprimarykey=strprimarykey.strip()

            strprimarykey2=strprimarykey2.strip()

            #如果要复制到的目标 表已经存在 ,应当作一定的处理--------

            #--------------------------

            strSql='SELECT ' +

    strfieldlist + ' INTO ' + strtt + ' FROM '+ strst

            ifdbtype=='sqlite':

                strSql='CREATE TABLE ' + strtt

    + ' AS SELECT ' + strfieldlist + ' FROM '+ strst

            ifiscopydata==False:

                strSql=strSql +' WHERE

    (1=2);'

            else:

                strSql=strSql +';'

            ifdbtype!='mysql':

                #非Mysql的情况下,开始一步执行到位

                cur.execute(strSql)#除Mysql之外的数据库的复制结果都不能得到完整的数据表信息,至少 数据表的 主键信息不会复制过来

                #因此下面必须手动再指定主键信息

                #sqlite目前没有办法修改主键字段

                ifstrprimarykey!='':

                    ifstrprimarykey2=='':

                        ifdbtype=='acc':

                            #access数据库第一步先删除失败的primary key 字段,

                            cur.execute('alter

    table ' + strtt + ' drop COLUMN ' + strprimarykey + ';')

                            #然后新增一个字段:

                            cur.execute('alter

    table ' + strtt + ' add COLUMN ' + strprimarykey + '

    counter NOT NULL PRIMARY KEY;')

                        ifdbtype=='mssql':

                            #mssql的处理也有两步:

                            #第一步感觉可以取消----

                            #cur.execute('alter

    table ' + strtt + ' alter column ' + strprimarykey + ' int not null')

                            cur.execute('alter

    table ' + strtt + ' add CONSTRAINT PK_' + strLs

    + ' PRIMARY KEY NONCLUSTERED ( ' + strprimarykey + ' )')

                    else:

                        #如果有第二个Primarykey

                        pass

            else:

                #mysql的执行比较特殊,分两步完成

                #第一步复制表的结构,只有mysql是完整复制了数据表的全部信息,包括主键(primary key)的信息

                cur.execute('CREATE TABLE ' + strtt

    + ' LIKE ' + strst + ';')

                #第二步是将源表的数据插入到复制后的新表

                ifiscopydata==True:

                    cur.execute('INSERT

    INTO ' + strtt + ' SELECT * FROM ' + strst + ';')

            con.commit()

            return True

        except Exception ase:

            mdbErrString='尝试在同一数据库中复制数据表时出错:' + str(e) + '\n此函数由【孤荷凌寒】创建qq号是578652607'

            ifisShowMsg==True:

               msgbox(mdbErrString)

            return False

        else:

            pass

        finally:

            try:

                cur.close()

            except:

                pass

    #检查一个活动的当前查询结果表中是否有指定的记录值存在,可以支持最多三个条件同时存在的情况

    #connectoracle()

    四、然后在Windows10下进行了全面的测试

    测试的文件代码如下:

    #!/usr/bin/env

    python3

    # -*-

    coding: utf-8 -*-

    importpypyodbc

    importpymysql

    importpymssql

    importsqlite3

    import_mty

    import_mdb

    def msgbox(info,titletext='孤荷凌寒的对话框QQ578652607',style=0,isShowErrMsg=False):

        return_mty.msgboxGhlh(info,titletext,style,isShowErrMsg)

    def conmssql():

        try:

            con=_mdb.conNetdbGhlh("www.lhghroom.cn", "lhghroom", "abc123", "ghlh")

            #pymssql没有execute()方法,游标cusor对象有这个方法

            msgbox('mssql')

            cur=con.cursor()

            #cur.execute('select

    * from pengwei;')

            #data=cur.fetchall()

            #cur.close()

            #创建一张表-----

            #lstNm=['id','nm','sex','yuwen','shuxue','age','birth','memo','img','ispass']

            #lstT=['auto','str','str','double','numeric','int','datetime','memo','ole','bool']

            #lstL=[0,10,2,0,0,0,0,0,0,0]

            #a=_mdb.newTableGhlh(con,'ghlhstable',lstNm,lstT,lstL,'mssql',None,True)

            #msgbox(str(a))

            #msgbox('ghlhstable存在吗?\n' +

    str(_mdb.isTableExistGhlh(con,'ghlhstable')))

            _mdb.copyDbTableGhlh(con,'pengwei','pw1','mssql','*','id','',True,False,'int','',False,True)

            #复制第二张表,要复制数据,但会出现错误

            _mdb.copyDbTableGhlh(con,'pengwei','pw2','mssql','*','id','',True,False,'int','',True,True)

            #复制第三张表,要复制数据,但会出现错误

            _mdb.copyDbTableGhlh(con,'pengwei','pw3','mssql','*','id','nm',True,False,'int','str',True,True)

            #cur.execute('show

    create table pengwei;') #mssql不支持此语句

            #data=cur.fetchall

            #msgbox(str(list(data)))

            msgbox('复制完毕')

            msgbox('pw3存在吗?\n' + str(_mdb.isTableExistGhlh(con,'pw3')))

            cur.close()

            con.close()

        except Exception ase:

            msgbox('出错了'+ str(e),'出错',16)

        finally:

            try:

                cur.close

                con.close

            except:

                pass

            finally:

                pass

    def conmysql():

        try:

            con=_mdb.conNetdbGhlh("localhost", "root", "abc123", "mysql",'mysql',True)

            #pymysql没有execute()方法,游标cusor对象有这个方法

            msgbox('mysql')

            cur=con.cursor()

            #cur.execute("select

    * from m;")

            #data=cur.fetchall()

            #msgbox(str(data))

            #cur.close()

            #创建一张表-----

            #lstNm=['id','nm','sex','yuwen','shuxue','age','birth','memo','img','ispass']

            #lstT=['auto','str','str','double','numeric','int','datetime','memo','ole','bool']

            #lstL=[0,      10,   2,     0,      0,       4,     0,        0,    8,    0]

            #a=_mdb.newTableGhlh(con,'ghlhstable',lstNm,lstT,lstL,'mysql',None,True)

            #msgbox(str(a))

            #msgbox('ghlhstable存在吗?\n' + str(_mdb.isTableExistGhlh(con,'ghlhstable')))

            #cur.execute('CREATE

    TABLE pw2 LIKE m;')

            #cur.execute('INSERT

    INTO pw2 SELECT * FROM m;')

            #复制第一张表,不复制数据

            _mdb.copyDbTableGhlh(con,'m','pw2','mysql','*')

            #复制第二张表,要复制数据

            _mdb.copyDbTableGhlh(con,'m','pw3','mysql','*','id','',True,False,'integer','str',True,True)

            #con.commit()

            cur.close()

            con.close()

        except Exception ase:

            msgbox('出错了'+ str(e),'出错',16)

        finally:

            try:

                cur.close

                con.close

            except:

                pass

            finally:

                pass

    def consqlite():

        try:

            stra=r'C:\ProgramData\SQLITE3\slone.s3db'

            con=_mdb.conLocaldbGhlh(stra)

            msgbox('sqlite')

            cur=con.cursor()

            #cur.execute('INSERT

    INTO pengwei VALUES (null,"张三","男",90,90,23,null,"no",null,null);')

            #con.commit()

            #cur.execute("select

    * from pengwei;")

            #data=cur.fetchall()

            #msgbox(str(data))

            #cur.close()

            #创建一张表-----

            #lstNm=['id','nm','sex','yuwen','shuxue','age','birth','memo','img','ispass']

            #lstT=['auto','str','str','double','numeric','int','datetime','memo','ole','bool']

            #lstL=[0,      10,   2,     0,      0,       4,     0,        0,    8,    0]

            #a=_mdb.newTableGhlh(con,'ghlhstable',lstNm,lstT,lstL,'sqlite',None,True)

            #msgbox(str(a))

            #msgbox('ghlhstable存在吗?\n' + str(_mdb.isTableExistGhlh(con,'ghlhstable')))

            _mdb.copyDbTableGhlh(con,'pengwei','pw2','sqlite',"*",'id','',True,False,'integer','str',False,True)

            #复制第二张表,要复制数据

            _mdb.copyDbTableGhlh(con,'pengwei','pw3','sqlite',"*",'id','',True,False,'integer','str',True,True)

            cur.execute("select * from

    pw3;")

            data=cur.fetchall()

            msgbox(str(data))

            cur.close()

            con.close()

        except Exception ase:

            msgbox('出错了'+ str(e),'出错',16)

        finally:

            try:

                cur.close

                con.close

            except:

                pass

            finally:

                pass

    def conaccess():

        try:

            stra=r'I:\新建文件夹\Database2.mdb'

            #stra=r'I:\新建文件夹\Database1.accdb'

            con=_mdb.conLocaldbGhlh(stra,'',True)

            msgbox('accese')

            cur=con.cursor()

            #cur.execute("select

    * from m;")

            #data=cur.fetchall()

            #msgbox(str(data))

            #cur.close()

            #创建一张表-----

            #lstNm=['id','nm','sex','yuwen','shuxue','age','birth','memo','img','ispass']

            #lstT=['auto','str','str','double','numeric','int','datetime','memo','ole','bool']

            #lstL=[0,      10,   2,     0,      0,       0,     0,        0,    0,    0]

            #a=_mdb.newTableGhlh(con,'ghlhstable',lstNm,lstT,lstL,'acc',None,True)

            #msgbox(str(a))

            #msgbox('ghlhstable存在吗?\n' +

    str(_mdb.isTableExistGhlh(con,'ghlhstable')))

            #cur.execute('select

    * into pw2 from m where 1=2;') #复制之后,关键key字段信息仍然不能保证被复制

            #cur.execute('alter

    table pw2 drop COLUMN id;') #先删除,然后再设置

            #cur.execute('alter

    table pw2 add COLUMN id counter NOT NULL PRIMARY KEY;') #重新添加

            #con.commit()

            #复制第一张表,只复制结构

            _mdb.copyDbTableGhlh(con,'m','pw2','acc','*','id','',True,False,'','str',False,True)

            #复制第二张表,要复制数据

            _mdb.copyDbTableGhlh(con,'m','pw3','acc','*','id','',True,False,'','str',True,True)

            cur.close()

            con.close()

        except Exception ase:

            msgbox('出错了'+ str(e),'出错',16)

        finally:

            try:

                cur.close

                con.close

            except:

                pass

            finally:

                pass

    def main():

        conmysql()

        conmssql()

        consqlite()

        conaccess()

    if __name__ == "__main__":

        main()

    因为进行了多次反复测试,因此注释掉的一些内容是多次测试的中间过程。

    四种数据库全部进行了完整的测试,按之前的研究复制基本完成,但只能算部分成功,还期待高手给予指导。

    五、在Linux系统fedora28中的测试也通过,access数据库没有 测试。

    ——————————

    今天整理的学习笔记完成,最后例行说明下我的自学思路:

    根据过去多年我自学各种编程语言的经历,认为只有真正体验式,解决实际问题式的学习才会有真正的效果,即让学习实际发生。在2004年的时候我开始在一个乡村小学自学电脑 并学习vb6编程语言,没有学习同伴,也没有高师在上,甚至电脑都是孤岛(乡村那时还没有网络),有的只是一本旧书,在痛苦的自学摸索中,我找到适应自己零基础的学习方法:首先是每读书的一小节就作相应的手写笔记,第二步就是上机测试每一个笔记内容是否实现,其中会发现书中讲的其实有出入或错误,第三步就是在上机测试之后,将笔记改为电子版,形成最终的修订好的正确无误的学习笔记。

    通过反复尝试错误,在那个没有分享与交流的黑暗时期我摸黑学会了VB6,尔后接触了其它语言,也曾听过付费视频课程,结果发现也许自己学历果然太低,就算是零基础的入门课程,其实也难以跟上进度,讲师的教学多数出现对初学者的实际情况并不了解的情况,况且学习者的个体也存在差异呢?当然更可怕的是收费课程的价格往往是自己难以承受的。

    于是我的所有编程学习都改为了自学,继续自己的三步学习笔记法的学习之路。

    当然自学的最大问题是会走那么多的弯路,没有导师直接输入式的教学来得直接,好在网络给我们带来无限搜索的机会,大家在网络上的学习日志带给我们共享交流的机会,而QQ群等交流平台、网络社区的成立,我们可以一起自学,互相批评交流,也可以获得更有效,更自主的自学成果。

    于是我以人生已过半的年龄,决定继续我的编程自学之路,开始学习python,只希望与大家共同交流,一个人的独行是可怕的,只有一群人的共同前进才是有希望的。

    诚挚期待您的交流分享批评指点!欢迎联系我加入从零开始的自学联盟。

    这个时代互联网成为了一种基础设施的存在,于是本来在孤独学习之路上的我们变得不再孤独,因为网络就是一个新的客厅,我们时刻都可以进行沙龙活动。

    非常乐意能与大家一起交流自己自学心得和发现,更希望大家能够对我学习过程中的错误给予指点——是的,这样我就能有许多免费的高师了——这也是分享时代,社区时代带来的好福利,我相信大家会的,是吧!

    根据完全共享的精神,开源互助的理念,我的个人自学录制过程是全部按4K高清视频录制的,从手写笔记到验证手写笔记的上机操作过程全程录制,但因为4K高清文件太大均超过5G以上,所以无法上传至网络,如有需要可联系我QQ578652607对传,乐意分享。上传分享到百度网盘的只是压缩后的720P的视频。

    我的学习过程录像百度盘地址分享如下:(清晰度:1280x720)

    链接:https://pan.baidu.com/s/16YRz22599elBkg2Hw5juoA

    提取码:k9ce

    Bilibili:

    https://www.bilibili.com/video/av38764629/

    喜马拉雅语音笔记:

    https://www.ximalaya.com/keji/19103006/147259395

    相关文章

      网友评论

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

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