如何优雅的将数据从sqlite3迁移到mysql

本文介绍了如何优雅地将数据从SQLite3数据库迁移到MySQL。通过分享一个基于StackOverflow解答改造的Python代码示例,演示了数据迁移过程,并提到了在迁移中可能出现的varchar(64,0)错误,需要手动修正为varchar(64)。" 101988305,8288225,微信小程序实现温度计功能,"['微信小程序', '小程序开发', 'UI设计', '前端框架', '自定义组件']
部署运行你感兴趣的模型镜像

网上找了很多资料。发现都是有问题的。

比较接近要求有的。http://stackoverflow.com/questions/18671/quick-easy-way-to-migrate-sqlite3-to-mysql

在他基础上进行改造。


python代码

import re
import fileinput

def this_line_is_useless(line):
    useless_es = [
            'BEGIN TRANSACTION',
            'COMMIT',
            'sqlite_sequence',
            'CREATE UNIQUE INDEX',
            ]
    for useless in useless_es:
        if re.search(useless, line):
            return True

def has_primary_key(line):
    return bool(re.search(r'PRIMARY KEY', line))

searching_for_end = False
for line in fileinput.input():
    if this_line_is_useless(line): continue

    if re.match(r".*, ''\);", line):
        line = re.sub(r"''\);", r'``);', line)
    if re.match(r'^CREATE TABLE.*', line):
        searching_for_end = True

    m = re.search('CREATE TABLE "?([a-z0-9_]*)"?(.*)', line)
    if m:
        name, sub = m.groups()
        line = "DROP TABLE IF EXISTS %(name)s;\nCREATE TABLE IF NOT EXISTS `%(name)s`%(sub)s\n"
        line = line % dict(name=name, sub=sub)
    else:
        m = re.search('INSERT INTO "([a-z0-9_]*)"(.*)', line)
        if m:
            line = 'INSERT INTO %s%s\n' % m.groups()
            line = line.replace('"', r'\"')
            line = line.replace('"', "'")
    line = re.sub(r"([^'])'t'(.)", "\1THIS_IS_TRUE\2", line)
    line = line.replace('THIS_IS_TRUE', '1')
    line = re.sub(r"([^'])'f'(.)", "\1THIS_IS_FALSE\2", line)
    line = line.replace('THIS_IS_FALSE', '0')
    if searching_for_end:
        if re.search(r"integer(?:\s+\w+)*\s*PRIMARY KEY(?:\s+\w+)*\s*,", line):
            line = line.replace("PRIMARY KEY", "PRIMARY KEY AUTO_INCREMENT")
        line = line.replace('"', '`').replace("'", '`')

    if re.match(r".*, ``\);", line):
        line = re.sub(r'``\);', r"'');", line)

    if searching_for_end and re.match(r'.*\);', line):
        searching_for_end = False

    if re.match(r"CREATE INDEX", line):
        line = re.sub('"', '`', line)
    
    if re.match(r'ANALYZE sqlite_master', line):
        line = ''
    
    if re.match(r'INSERT INTO sqlite_stat1', line):
        line = ''

    if line is not None:
        print line,

执行

sqlite3 your.db .dump | python dump_for_mysql.py > dump.sql

之后联接数据库过程中需要设置联接以后编码为utf-8

然后导入dump.sql执行。ok了。


其中可能会出现错误

varchar(64,0)

手工修改为varchar(64)

=_=

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值