Python数据库迁移脚本(终极版)

上次的那几个脚本这次全部整合到了一起,而且后面发现了一个可以使用的ODBC包,于是这次采用的方式就很简单了,直接通过ODBC将InterBase数据库中的数据全部取出来之后通过Python的sqlalchemyORM框架直接连接远程的MySQL数据库,之后便可以方便的传递数据了,当然,作为我的终极完善版本,自动模式和手动模式是少不了的了,在自动模式中将自动检查InterBase数据库是否存在,如果不存在则自动restore,然后自己创建InterBase的数据源,之后便可以取出数据了,下面是流程图。

那么下面就是讲解代码的时候咯~

这次的这个脚步主要分为三个函数,main函数,odbc函数和restore函数,由于手动模式包含在自动模式中,那么我就只介绍自动模式了。

我在脚本中定义了一个字典用来存储脚本的配置信息,用户可以在字典中定义自己需要的功能和数据库信息等。

#定义一个配置字典,将所需的参数添加在字典中方便改动

setting = {

#设置启动模式

‘operate_type‘:OPERATE_AUTO_RESTORE,

#备份文件的地址

‘gbk_path‘:‘C:\\XXX\\DB.gbk‘,

#需要恢复的InterBase数据库地址

‘gdb_path‘:‘C:\\\XXX\\\DB.GDB‘,

#设置需要连接的MySQL数据库的用户名,密码,ip地址和端口号

‘username‘:‘root‘, ‘password‘:‘root‘, ‘port‘:‘3306‘, ‘dbname‘:‘test‘, ‘localhost‘:‘127.0.0.1‘,

#设置需要连接的ODBC的名字以及用户名和密码

‘DSN‘:‘XXX‘,‘UID‘:‘SYSDBA‘,‘PWD‘:‘masterkey‘}

在脚本启动的时候就通过判断来确定用户是以何种模式进行的脚本,紧接着运行适合的脚本

if __name__ == ‘__main__‘:

    #判断启动模式是自动模式还是手动模式

    if setting[‘operate_type‘]==OPERATE_AUTO_RESTORE:

    #检查数据库是否存在,如果存在将跳过restore

        if os.path.isfile(‘C:\\XXX\\DB.GDB‘) == False:
            restore()
            odbc()
            main()
        else:
            print ‘The database has been exist, will skip restore...‘
            odbc()
            main()
    elif setting[‘operate_type‘]==OPERATE_AUTO_EXPORT:
        main()

当Python判断InterBase数据库不存在之后便执行restore来恢复数据库

#自动模式中恢复数据库的方法

def restore():
    os.system(‘gbak -c -user "sysdba" -password "masterkey" "‘+setting[‘gbk_path‘]+‘" "127.0.0.1:‘+setting[‘gdb_path‘]+‘"‘)

之后便是自动创建InterBase的ODBC数据源了,当然首先要安装InterBase的驱动了,网上有很多,我就不一一的列出了,由于是在windows平台上运行的,所以很方便的就可以使用添加注册表的形式将需要的数据源添加进系统中了,当然,既然是通过注册表导入的那么就必然会产生出一个注册表文件了,我将它默认的生成在C盘的根目录,然后在导入完成之后再删除掉,这样就在脚本运行完之后也不会产生垃圾了。

#下面这个字符串创建了所需要的ODBC数据源,并将数据源中的数据库地址改为restore输出的数据库地址

def odbc():
    odbcreg = ‘‘‘Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\ODBC\ODBC.INI]

[HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\kmk]
"Driver"="C:\\\WINDOWS\\\system32\\\OdbcFb32.dll"
"Description"=""
"Dbname"="‘‘‘+setting[‘gdb_path‘]+‘‘‘"
"Client"=""
"User"="SYSDBA"
"Role"=""
"CharacterSet"="NONE"
"JdbcDriver"="IscDbc"
"ReadOnly"="N"
"NoWait"="N"
"LockTimeoutWaitTransactions"=""
"Dialect"="3"
"QuotedIdentifier"="Y"
"SensitiveIdentifier"="N"
"AutoQuotedIdentifier"="N"
"UseSchemaIdentifier"="0"
"SafeThread"="Y"
"Password"="DKEBFJENHFCOBHGHLAIMNAAFICELEAEGDNMFNOGALAMHBBGCHFADNKCBPPGMANOGIEKENIOPHDIPBIECPLLLCBIKEJKMJLPLIB"

[HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources]
"kmk"="Firebird/InterBase(r) driver"

    ‘‘‘
    #在C盘根目录下新建一个临时的注册表文件用来将新建的数据源导入

    fp = open(‘C:\\db007.reg‘,‘w‘)
    try:
        fp.write(odbcreg)
    except Exception,e:
        print e
    finally:
        fp.close()

    #执行生成的数据源注册表文件

        os.system(‘regedit /s C:\\db007.reg‘)

    #将临时产生的注册表文件删除

        os.remove(‘C:\\db007.reg‘)

紧接着就是我们最关键的main函数咯~

当然了,这次和上次一样使用的是Python中SQLAlchemyORM的框架了,所以第一件事便是连接数据库,获得Session了,不过再次之前还是要先构建类与表的映射关系了。

#创建一个基类

Base = declarative_base()

#定义一个User类与数据库进行映射

class User(Base):
    __tablename__ = ‘User‘
    NAME= Column(Integer, primary_key=True)
    PASSWORD= Column(Integer)
                .......

然后在获得Session之后便可以连接ODBC了,通过SQL语句将InterBase数据库中的数据取出来。

#创建数据库的连接

    mysql_db = create_engine(
    ‘mysql://‘+setting[‘username‘]+‘:‘+setting[‘password‘]+‘@‘+setting[‘localhost‘]+    ‘:‘+setting[‘port‘]+‘/‘+setting[‘dbname‘],echo=False)

    Base.metadata.bind=mysql_db
    Base.metadata.create_all(mysql_db)

    #创建一个Session

    Session = sessionmaker(bind=mysql_db)
    session = Session()
    #pdb.set_trace()

    #创建与ODBC数据源的连接

    conn = pyodbc.connect(‘DSN=‘+setting[‘DSN‘]+‘;UID=‘+setting[‘UID‘]+‘;PWD=‘+setting[‘PWD‘]+‘‘)
    curs = conn.cursor()

    #通过SQL语句得到一个对象

    dbf = curs.execute(‘select *from User‘)

下面就是自动模式与手动模式都必须进过的步骤了~通过循环将数据提交到MySQL中,当然,为了防止数据库中已经有了数据,那么就在添加之前检查数据库中是否有这个数据,如果有的话便跳过这次添加,继续后面的步骤。然后在每1000次添加之后提交一次数据,以减轻数据的压力,最后在循环外将除以1000的余数统一再存入数据库中。

#循环的将对象中的数据保存到User类中

    commint = 0

    for line1 in dbf:

        #检查数据库中的数据是否有数据,如果没有则加入数据

        exist = session.query(User).filter(User.ID == line1.ID,User.NAME == line1.NAME).count()
        if exist>0:
            continue

        u = User()
        u.NAME = line1.NAME
        ......
        u.PASSWORD = line1.PASSWORD

        session.add(u)
        commint = commint+1

        #当循环了1000次之后进行一次提交

        if commint%1000==0:
            try:
                session.commit()
                #pdb.set_trace()
                session.flush()
            except:
                print ‘error‘
                session.rollback()

    #将剩余的数据进行提交

    try:
        session.commit()
        session.flush()
    except Exception , e:
        print e
        session.rollback()
    session.close()

至此,这个是用ODBC读取数据然后在保存在MySQL的Python脚本就写完了,断断续续进过了一周多的日子,我实习的第一个正式任务也算是完美收官了,曾经在校园里学了几年的J2EE,万万没想到最后却来做了Python和数据库。。。。不知道后面的日子里还有什么样奇怪的任务等着我~~当然!我依旧不会放弃web的!加班狗努力!

时间: 2024-10-14 14:52:12

Python数据库迁移脚本(终极版)的相关文章

数据库升级脚本-最终版哦

spool D:\工作文档\总参\邵工\1222\spbm1222.log --table 表1.商品编码表create table DM_GY_SPBM( spbm VARCHAR2(19) not null, spmc VARCHAR2(200), sm VARCHAR2(4000), zzssl VARCHAR2(200), gjz VARCHAR2(4000), hzx CHAR(1), bbh VARCHAR2(20), kyzt CHAR(1), zzstsgl VARCHAR2(5

Python 实现数据库更新脚本的生成

我在工作的时候,在测试环境下使用的数据库跟生产环境的数据库不一致,当我们的测试环境下的数据库完成测试准备更新到生产环境上的数据库时候,需要准备更新脚本,真是一不小心没记下来就会忘了改了哪里,哪里添加了什么,这个真是非常让人头疼.因此我就试着用Python来实现自动的生成更新脚本,以免我这烂记性,记不住事. 主要操作如下: 1.在原先 basedao.py 中添加如下方法,这样旧能很方便的获取数据库的数据,为测试数据库和生产数据库做对比打下了基础. 1 def select_database_st

django迁移脚本

执行migrate报错的解决办法: 想知道migrate为什么报错,需要先了解migrate到底做了什么事情 migrate做了什么事情? 1.将相关的迁移脚本翻译成sql语句,然后在数据库中执行 2.如果sql语句执行没有问题,那么会将相关的迁移脚本的名字记录到数据库中django_migrations表中 migrate怎么判断哪些迁移脚本需要执行? migrate会将代码中的迁移脚本和数据库中的迁移脚本做对比,如果发现数据库中没有这个迁移脚本,便会执行 原因 执行migrate报错,是因为

Saiku数据库迁移后的刷新脚本-Shell脚本读取数据库中的数据(二十三)

Saiku数据库迁移后的刷新脚本 之前有谈过对saiku中的数据进行刷新,因为saiku默认会从缓存中查询数据,但是配置不使用缓存又会效率低下... 所以这里就需要做一个数据刷新,每次ETL之后都需要执行一遍数据刷新脚本. 刷新脚本主要分为两部分 1.使用shell命令从数据库中读取已有的用户信息 (因为已经做过数据迁移,数据库已经从h2转为我们自己的mysql) saikuRefresh.sh #!/bin/bash #数据库连接信息 HOSTNAME="10.11.22.33" #

Flask从入门到精通之使用Flask-Migrate实现数据库迁移

在开发程序的过程中,你会发现有时需要修改数据库模型,而且修改之后还需要更新数据库.仅当数据库表不存在时,Flask-SQLAlchemy 才会根据模型进行创建.因此,更新表的唯一方式就是先删除旧表,不过这样做会丢失数据库中的所有数据.更新表的更好方法是使用数据库迁移框架.源码版本控制工具可以跟踪源码文件的变化,类似地,数据库迁移框架能跟踪数据库模式的变化,然后增量式的把变化应用到数据库中. SQLAlchemy 的主力开发人员编写了一个迁移框架,称为Alembic(https://alembic

Python Cookbook(第3版)中文版pdf

下载地址:网盘下载 内容简介  · · · · · · <Python Cookbook(第3版)中文版>介绍了Python应用在各个领域中的一些使用技巧和方法,其主题涵盖了数据结构和算法,字符串和文本,数字.日期和时间,迭代器和生成器,文件和I/O,数据编码与处理,函数,类与对象,元编程,模块和包,网络和Web编程,并发,实用脚本和系统管理,测试.调试以及异常,C语言扩展等. 本书覆盖了Python应用中的很多常见问题,并提出了通用的解决方案.书中包含了大量实用的编程技巧和示例代码,并在Py

flask-migrate数据库迁移

数据库迁移 在Flask中可以使用Flask-Migrate扩展,来实现数据迁移.并且集成到Flask-Script中,所有操作通过命令就能完成. 为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可以附加到flask-script的manager对象上. 创建迁移仓库 python3 database.py db init 创建迁移脚本 自动创建迁移脚本有两个函数 upgrade():函数把迁移中的改动应用到数据库中. downgrade():函数则将

Python核心编程 第3版 中文版pdf

[下载地址] <Python核心编程(第3版)>是经典畅销图书<Python核心编程(第二版)>的全新升级版本,总共分为3部分.第1部分为讲解了Python的一些通用应用,包括正则表达式.网络编程.Internet客户端编程.多线程编程.GUI编程.数据库编程.Microsoft Office编程.扩展Python等内容.第2部分讲解了与Web开发相关的主题,包括Web客户端和服务器.CGI和WSGI相关的Web编程.Django Web框架.云计算.高级Web服务.第3部分则为一

Python参考手册 第4版高清中文PDF下载

本书是权威的Python语言参考指南,内容涉及核心Python语言和Python库的最重要部分.本书内容简洁扼要.可读性强,书中还包括了一些没有在Python官方文档或其他资料中出现过的一些高级的主题. 这一版在内容上进行了全面更新,介绍了Python 2.6和Python 3新引入的编程语言特性和库模块,同时还分析了Python程序员面临的如下难题:是应继续使用现有的Python代码,还是应制定计划将其移植到Python 3? Python参考手册 第4版高清中文PDF资料下载:https:/