就是要学社区 QQ群组:646854445
你并非已无懈可击,所以你不能逃避问题,拒绝学习!

047孤荷凌寒自学python通用跨数据库同一数据库中复制数据表函数

|阅读量:63 |发布于2020-08-02 07:38:38


正文内容

Github:

https://github.com/lhghroom/ZeroBasicSelfStudyPython


(完整学习过程屏幕记录视频地址在文末)

今天继续建构自感觉用起来顺手些的自定义模块和类的代码。

今天打算完成的是通用的(至少目前操作四种数据库)在同一数据库内复制数据表的方法函数。


此设想最初我自我感觉都非常简单,然而事实是关系型数据库统一使用的sql语言在各家其实是完全不同的!


一、了解清楚了我目前研究的四种关系型数据库对同一数据库中数据表的复制操作的sql语句的异同也效果局限

(一)Access 数据库与mssql数据库

access数据库一般是作为轻量级的桌面级关系型数据库使用的;

而mssql是微软出品的大型商用服务器型关系数据库。

它们的复制数据表的操作sql语句一样如下:

1.只复制数据表的结构而不复制源表的数据

select * into [目标表] from [源表] where 1=2;

最后的【where 1=2】就是限制连同数据一起复制的条件式,只要条件式返回的布尔值为false即可。

2.要复制数据表结构与所有数据

select * into [目标表] from [源表];


【注意】:通过这样的方式复制的数据表,目标表中虽然完整的复制了源表的所有列的类型、大小等信息,却唯独不会包含各列是否是【主键】的信息。

这其实也就是说复制已经基本失败了。


(二)sqlite数据库

sqlite是本地化的轻量级关系型数据库。

它的复制代码如下

1.只复制数据表的结构而不复制源表的数据

CREATE TABLE [目标表] AS SELECT * FROM [源表] WHERE 1=2;

最后的【where 1=2】就是限制连同数据一起复制的条件式,只要条件式返回的布尔值为false即可。

2.要复制数据表结构与所有数据

CREATE TABLE [目标表] AS SELECT * FROM [源表];

【注意】:通过这样的方式复制的数据表,目标表中虽然完整的复制了源表的所有列的类型、大小等信息,却唯独不会包含各列是否是【主键】的信息。

这其实也就是说复制已经基本失败了。


(三)mysql数据库

mysql是中大型服务器型关系数据库。

它的复制数据表的sql语句如下:

1.只复制数据表的结构而不复制源表的数据

CREATE TABLE [目标表] LIKE [源表];

2.要复制数据表结构与所有数据

将在只复制数据表结构的基础上再多执行一步:

CREATE TABLE [目标表] LIKE [源表];

INSERT INTO [目标表] SELECT * FROM [源表];

【注意】在目前我正在研究的四种数据库中,只有mysql的表复制sql语句是完美无瑕的。

但:

CREATE TABLE [目标表] LIKE [源表];

只支持mysql5.0以上的版本,多数资料是这样说的,没有亲自验证。


二、尝试解决另外三种数据库的复制数据表后不包括主键列信息的问题

因为复制代码执行后,目标数据表并没有主键列的信息,那就只有后面手动添加上了。

(一)Access

并不能直接修改一个列为主键列。

于是根据所查阅到的资料,整理笔记如下:

1.先在数据表中删除要作为主键的列:

alter table [目标表] drop COLUMN [要作为主键的列名];

2.再添加这个列,并在添加列的sql代码中指定此列为主键。

alter table [目标表] add COLUMN [要作为主键的列名] 列的数据类型 NOT NULL PRIMARY KEY;

【注意】access只能通过sql语句添加一个列作为主键。虽然在access软件中可以手动指定多个列作为主键组。

(二)mssql

mssql可以直接修改一个列或多个列为主键列

'alter table [目标表] add CONSTRAINT PK_目标表名称 PRIMARY KEY NONCLUSTERED (一个或多个要作为主键的列名称);'

当然之前复制数据表时是连同表中数据一起复制的,那么必须保证要作为主键的列中各行中是没有null值的数据的。

如有必要,应当将此列先指定为not null型的列,sql语句如下:

alter table [目标表] alter column [一个要作为主键的列名] 列的数据类型 not null

【注意】虽然mssql可以指定多个列作为主键,然而如果这么做了,若只是复制数据表的结构倒没有问题,然而一旦要连同数据也一起复制,多数情况下会报完全不相关莫名其妙的错误。

(三)sqlite

sqlite的sql语句根本就不能对一个表的中的列的任何属性进行修改,也不能删除列。

因此常规方法都已失效。

好在sqlite中有一个相对而言比较简单的获取一个数据表所有列完整信息结构的sql语句:

PRAGMA table_info([源表名]);

通过此sql代码将得到一个嵌套列表对象,

通过相关列表转换操作,就可以还原数据源表的创建表的sql语句,然后重新创建一个新表,也算作是完成了数据表的结构复制。

如果再要复制数据,则执行 insert into 语句即可从源表向目标表中导入数据

这算是变通地完成了数据表的复制。

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

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

提取码:k9ce


Bilibili:

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


喜马拉雅语音笔记:

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



【就是要学】社区
一个平等,纯粹的社群
本社群旨在为真正愿意不断学习,终身成长的朋友提供一个平等互助互相鼓励的清洁纯粹的学习交流的平台。
加入社群将获得
1、与真正终身学习者为伍
2、在榜样带领下坚持每天学习,终身成长
3、养成记录时间日志,成功日记的习惯


【就是要学】社区QQ群:646854445





【返回首页】