大器之前有一个程序的数据存储采用了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变量,前者是表名和相应的字段名,后者是相对于各字段的目标类型。
在此记录一下整个数据转换的方法,作为以后可能用到的备用知识。
我是大器,正在建立自己的知识库,并将这些经验分享给你,请关注我,一起交流学习。
相关阅读: