首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >收藏!用Python一键批量将任意结构的CSV文件导入 SQLite 数据库。

收藏!用Python一键批量将任意结构的CSV文件导入 SQLite 数据库。

作者头像
数据森麟
发布2020-02-20 16:31:55
5.3K0
发布2020-02-20 16:31:55
举报
文章被收录于专栏:数据森麟数据森麟

作者:牛思勉

来源:智能演示

上周,推送了一篇:“ 收藏!用Python一键批量将任意结构的CSV文件导入MySQL数据库。” 本文是上篇的姊妹篇,只不过是把数据库换成了 Python 自带的SQLite3。

使用 SQLite3 的优势还是很明显的,它是一种嵌入式数据库,只是一个.db格式的文件,无需安装、配置和启动,移植性非常好。是轻量级数据的不二之选!推荐看一下我写的入门文章:“ 收藏!Python内置的轻量级数据库竟如此好用!全网最实用sqlite3实战项目。”

上一篇介绍的是一键批量导入 MySQL 数据库,这一篇介绍的是一键批量导入 SQLite3 数据库,两者代码 90% 相同。所以本文重点介绍不同之处。

先看一下程序运行效果:

程序运行动图演示.gif

两篇文章使用的数据源是一模一样的。经本人亲测,导入到 SQLite3 的速度要比导入到 Mysql 快的多。这也进一步验证了,处理轻量级数据,SQLite 要便捷、快速的多。

下面我们就来看看两者代码的主要不同吧:

1. 数据库连接方式不同

try:
    conn = conn = sqlite3.connect(path+'\csv.db')
    cur = conn.cursor()
    print('数据库连接成功!')
    print(' ')
except:
    print('数据库连接失败!')

SQLite3 数据库的连接方式更简单,直接指明路径即可。

2. 代码优化,提高通用性

2.1 优化了数据库表名称

for file in files:
    if file.split('.')[-1] in ['csv']:
        i += 1
        filename = '`' + 'tab_' + file.split('.')[0].replace('-', '_').replace(' ', '_').replace(':','') + '`'

通过遍历每一个 CSV 文件的名称,计算出一个数据库表名称,确保计算出的表名称符合数据库规则:

filename = '`' + 'tab_' + file.split('.')[0].replace('-', '_').replace(' ', '_').replace(':','') + '`'

首先,在数据库表名称前加上 tab_ ,避免纯数字作为表名称时程序报错;其次,替换了 -:空格;最后,在数据库表名称前后加上一对反引号。

2.2 优化了数据库表字段名称

types = f.ftypes
        field = [] #用来接收字段名称的列表
        table = [] #用来接收字段名称和字段类型的列表
        for item in columns:
            item1 = '`'+item.replace('-', '_').replace(' ', '_').replace(':','')+'`'
            if 'int' in types[item]:
                char = item1 + ' INT'
            elif 'float' in types[item]:
                char = item1 +' FLOAT'
            elif 'object' in types[item]:
                char = item1 +' VARCHAR(255)'
            elif 'datetime' in types[item]:
                char = item1 + ' DATETIME'
            else:
                char = item1 + ' VARCHAR(255)'
            table.append(char)
            field.append(item)

        tables = ','.join(table)
        #print(tables)
        fields = ','.join(field)
        #print(fields)

和数据库表名称优化一样,替换了 -:空格等特殊符号,并在每一个字段名称前后加上一对反引号。

3. SQL 语句不同

3.1 创建自增主键语句不同

创建 MySQL 数据库自增主键的语句是:id0 int PRIMARY KEY NOT NULL auto_increment;创建 SQLite 数据库自增主键的语句是:id0 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL

两者略有不同,SQLite 是用 AUTOINCREMENT 创建自增主键。

3.2 插入数据的语句不同

values = f.values.tolist()
s = ','.join(['?' for _ in range(len(f.columns))])
insert_sql = 'insert into {}({}) values({})'.format(filename,fields,s)
cur.executemany(insert_sql, values)
conn.commit()

主要区别是:SQLite 使用 ? 来占位。

以上就是一键批量将任意结构的CSV文件导入SQLite数据库与MySQL数据库代码的主要不同点。如果您还没有看过上一篇文章,强烈建议去看一下!上篇文章代码实现思路方面讲解的更详细:“ 收藏!用Python一键批量将任意结构的CSV文件导入MySQL数据库。”

下面给大家介绍一款 SQLite 数据可视化工具:

SQLiteStudio 是一款绿色小巧的 SQLite 数据库可视化工具,功能强大,操作简单。

我们可以将上文自动导入生成的数据库 csv.db 添加到 SQLiteStudio 中,可以很方便的查看到数据库中有哪些表,以及表结构和数据。见下图:

添加数据库动图演示.gif

我们也可以打开一个 SQL编辑器,输入 SQL 命令,执行你想要的操作。见下图:

查询动图演示.gif

SQLiteStudio 还有很多好用的功能,本文不再介绍,感兴趣的朋友可以研究一下。

本文完,谢谢阅读!

以下文章来源于智能演示,作者老牛思勉

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据森麟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 数据库连接方式不同
  • 2. 代码优化,提高通用性
    • 2.1 优化了数据库表名称
      • 2.2 优化了数据库表字段名称
      • 3. SQL 语句不同
        • 3.1 创建自增主键语句不同
          • 3.2 插入数据的语句不同
          相关产品与服务
          文件存储
          文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档