四时宝库

程序员的知识宝库

如何将MongoDB转成SQLite数据库

大器之前有一个程序的数据存储采用了MongoDB数据库,当时也不知道需要哪种数据库,当时大致看了一下它的语法比较简单易懂,就用上了。

后来电脑重装过一次后,我又要重新配置一遍数据库,而且需要在电脑后台一直运行数据库服务器程序,虽然不用占用多少系统资源,但如果能精简掉就更好了。

MongoDB为了更快的访问数据,数据文件存储的方式跟其他数据库也不太一样,文件夹下面存储了非常多的文件。对于有强迫症的人来说,最好越少越好,越简洁越好。MongoDB作为一种分布式数据库,最适合的场景应该是网络服务器。

作为本地的数据存储,要求配置简单,数据库文件容易备份和移动,而SQLite数据库正是一种符合要求的数据库。正因为SQLite数据库对系统配置要求极低,又符合SQL的标准语法,而被广泛应用于移动设备中。

在Python的模块中内置了对SQLite数据库的支持,不需要进行任何数据库的配置,不需要运行后台系统服务,数据库文件也只有一个,毫无疑问地成为本地数据存储的首选数据库。

转换数据库之前,首先需要做的是确定源数据的数据结构和目标数据的数据结构,然后从源数据库按条读取,再向目标数据库按行写入。转换的过程比较简单,下面贴出了全部的代码。

import os
import records
from pymongo import MongoClient


class database():
    def __init__(self):
        self.sdb = records.Database('sqlite:///Cover.db')
        client = MongoClient('localhost', 27017)
        self.mdb = client.Cover

    def convert(self, table, type):
        for item in table:
            # 创建表
            cols = [n + ' ' + t for n, t in zip(table[item], type[item])]
            query = 'CREATE TABLE IF NOT EXISTS {}({})'.format(
                item, ' ,'.join(cols))
            self.sdb.query(query)
            # 插入数据
            cols = [':' + n for n in table[item]]
            query = 'INSERT INTO {}({}) VALUES({})'.format(
                item, ' ,'.join(table[item]), ' ,'.join(cols))
            for doc in self.mdb[item].find():
                # 需要转换格式的字段
                # star = doc['star']
                # if isinstance(star, list):
                #   doc['star'] = ','.join(star)
                self.sdb.query(query, **doc)


if __name__ == '__main__':
    tables = {
        'table1': ['mid', 'vid', 'title', 'image', 'date', 'length', 'studio', 'star', 'path'],
        'table2': ['mid', 'vid', 'title', 'image', 'date', 'length', 'studio', 'star', 'path'],
        'table3': ['starId', 'star', 'type', 'profile']}
    types = {
        'table1': [
            'TEXT PRIMARY KEY', 'TEXT', 'TEXT', 'TEXT', 'TEXT',
            'TEXT', 'TEXT', 'TEXT', 'TEXT'],
        'table2': [
            'TEXT PRIMARY KEY', 'TEXT', 'TEXT', 'TEXT', 'TEXT',
            'TEXT', 'TEXT', 'TEXT', 'TEXT'],
        'table3': ['TEXT PRIMARY KEY', 'TEXT', 'TEXT', 'TEXT']}
    db = database()
    db.convert(tables, types)

简单说明一下代码中的tables和types变量,前者是表名和相应的字段名,后者是相对于各字段的目标类型。

在此记录一下整个数据转换的方法,作为以后可能用到的备用知识。


我是大器,正在建立自己的知识库,并将这些经验分享给你,请关注我,一起交流学习。


相关阅读:

Python pip包管理工具

用Python获取子目录或文件列表

如何用PyQt编写桌面程序,创建并打开播放列表?

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接