#-----复制表的操作----------------
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/
喜马拉雅语音笔记:
网友评论