美文网首页学习永远无止境手写笔记
孤荷凌寒自学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