InterBase数据库迁移到MySQL(数据导入)
在这个脚本中我使用的是Python的ORM框架SQLAlchemy来连接远程的MySQL数据库的,在写这个脚本的时候为了方便参数的输入,我就给之前和这个脚本添加了一个新的功能,就是在调用这个脚本的时候后面可以传入参数,这样只需要在执行脚本的时候就可以方便的输入所要使用的路径。
那么现在开始对导出的数据进行解析咯~由于之前已经将列名和数据都写入到了文本文件中, 现在只需要一行一行的读取出来,然后和类中的属性一一对应就可以了,那么现在开始读取资料吧~老样子,先用切片将之前写在文本文件中的第一行列名取出来咯~然后我定义了一个字典,其中key值存入列名,value中存数组的下标,这样在后面赋值的时候就可以一个属性名对应一个列名了,不仅逻辑清晰,代码也好看多了,这样再使用Python中的split函数将字符串转换成list来读取到类中,然后每读取1000次再将session提交到数据库一次,这样可以大幅度的减小对数据库的操作,而提高性能。下面就附上代码了:
from sqlalchemy.orm import mapper, sessionmaker
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData,Double,TIMESTAMP
from sqlalchemy.sql.expression import Cast
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.dialects.mysql import \
BIGINT, BINARY, BIT, BLOB, BOOLEAN, CHAR, DATE, \
DATETIME, DECIMAL, DECIMAL, DOUBLE, ENUM, FLOAT, INTEGER, \
LONGBLOB, LONGTEXT, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, NCHAR, \
NUMERIC, NVARCHAR, REAL, SET, SMALLINT, TEXT, TIME, TIMESTAMP, \
TINYBLOB, TINYINT, TINYTEXT, VARBINARY, VARCHAR, YEAR
import os
import re,pdb,sys,getopt opts, args = getopt.getopt(sys.argv[1:], "hf:u:p:i:d",["help","file=","user=","pass=","ip=","db="])
input_file=""
username=""
password=""
host=""
databasename=""
def usage():
print """
-h --help print the help
-g --gbk The path of the backup file
-b --gdb Have to backup the database path
"""
for op, value in opts:
if op in ("-f","--file"):
input_file = value
elif op in ("-u","--user"):
username = value
elif op in ("-p","--pass"):
password = value
elif op in ("-i","--ip"):
host = value
elif op in ("-d","--db"):
databasename = value
elif op in ("-h","--help"):
usage()
sys.exit() Base = declarative_base()
mysql_db = create_engine('mysql://'+username+':'+password+'@'+host+':3306/'+databasename+'')
metadata.create_all(mysql_db) class User(Base):
__tablename__ = 'users'
DAY_BATCH_ID = Column(Integer, primary_key=True)
ITEMID = Column(Integer, primary_key=True)
NETSALES = Column(DOUBLE, nullable=True)
NETQTY = Column(DOUBLE, nullable=True)
VOIDSALES = Column(DOUBLE, nullable=True)
VOIDQTY = Column(DOUBLE, nullable=True)
RETURNSALES = Column(DOUBLE, nullable=True)
RETURNQTY = Column(DOUBLE, nullable=True)
DISCOUNTSALES = Column(DOUBLE, nullable=True)
DISCOUNTQTY = Column(DOUBLE, nullable=True)
OTHQTY = Column(DOUBLE, nullable=True)
STAFFQTY = Column(DOUBLE, nullable=True)
WASTEQTY = Column(DOUBLE, nullable=True)
MODIFQTY = Column(DOUBLE, nullable=True)
COST = Column(DOUBLE, nullable=True)
UNITCOST = Column(DOUBLE, nullable=True)
SALEQTY = Column(DOUBLE, nullable=True)
SALEAMT = Column(DOUBLE, nullable=True)
ADJ_AMT = Column(DOUBLE, nullable=True)
OVERRIDE_AMT = Column(DOUBLE, nullable=True)
OVERRIDE_QTY = Column(Integer, nullable=True)
OTHAMT = Column(DOUBLE, nullable=True)
WASTEAMT = Column(DOUBLE, nullable=True)
TAXAMT = Column(DOUBLE, nullable=True)
SELFCOMMISSION = Column(DOUBLE, nullable=True)
FULLCOMMISSION = Column(DOUBLE, nullable=True)
NET_ITEMS = Column(Integer, nullable=True)
VOID_ITEMS = Column(Integer, nullable=True)
RETURN_ITEMS = Column(Integer, nullable=True)
DISCOUNT_ITEMS = Column(Integer, nullable=True)
OTH_ITEMS = Column(Integer, nullable=True)
SALE_ITEMS = Column(Integer, nullable=True)
MODIF_ITEMS = Column(Integer, nullable=True)
WASTE_ITEMS = Column(Integer, nullable=True)
TICKETCOUNT = Column(Integer, nullable=True)
AVG_COST = Column(DOUBLE, nullable=True)
VOIDSALES_TAX = Column(DOUBLE, nullable=True)
RETURNSALES_TAX = Column(DOUBLE, nullable=True)
DISCOUNTSALES_TAX = Column(DOUBLE, nullable=True)
OVERRIDE_AMT_TAX = Column(DOUBLE, nullable=True)
OTHAMT_TAX = Column(DOUBLE, nullable=True)
WASTEAMT_TAX = Column(DOUBLE, nullable=True)
SALESAMT_TAX = Column(DOUBLE, nullable=True)
LAST_TRANS_TIME = Column(TIMESTAMP, nullable=True) mapper(User, userTable) Session = sessionmaker()
Session.configure(bind=mysql_db)
session = Session() def main():
file1 = open(input_file).readlines()
#通过切片取得第一行中的值并将第一行的字符串组装成数组保持在字典中
file2 = file1[:1]
for line in lines2:
result = line.split(",")
mydic={}
for v,k in enumerate(result):
mydic[k]=v
#取得文件中从第二行开始的所有数据,通过切片去除第一行的数据
file3 = file1[1:-1]
for line1 in file3:
commint = 0
u = User()
line1 = line1.split(',')
u.DAY_BATCH_ID = line1[mydic['DAY_BATCH_ID']]
u.ITEMID = line1[mydic['ITEMID']]
u.NETSALES = line1[mydic['NETSALES']]
u.NETQTY = line1[mydic['NETQTY']]
u.VOIDSALES = line1[mydic['VOIDSALES']]
u.VOIDQTY = line1[mydic['VOIDQTY']]
u.RETURNSALES = line1[mydic['RETURNSALES']]
u.RETURNQTY = line1[mydic['RETURNQTY']]
u.DISCOUNTSALES = line1[mydic['DISCOUNTSALES']]
u.DISCOUNTQTY = line1[mydic['DISCOUNTQTY']]
u.OTHQTY = line1[mydic['OTHQTY']]
u.STAFFQTY = line1[mydic['STAFFQTY']]
u.WASTEQTY = line1[mydic['WASTEQTY']]
u.MODIFQTY = line1[mydic['MODIFQTY']]
u.COST = line1[mydic['COST']]
u.UNITCOST = line1[mydic['UNITCOST']]
u.SALEQTY = line1[mydic['SALEQTY']]
u.SALEAMT = line1[mydic['SALEAMT']]
u.ADJ_AMT = line1[mydic['ADJ_AMT']]
u.OVERRIDE_AMT = line1[mydic['OVERRIDE_AMT']]
u.OVERRIDE_QTY = line1[mydic['OVERRIDE_QTY']]
u.OTHAMT = line1[mydic['THAMT']]
u.WASTEAMT = line1[mydic['WASTEAMT']]
u.TAXAMT = line1[mydic['TAXAMT']]
u.SELFCOMMISSION = line1[mydic['SELFCOMMISSION']]
u.FULLCOMMISSION = line1[mydic['FULLCOMMISSION']]
u.NET_ITEMS = line1[mydic['NET_ITEMS']]
u.VOID_ITEMS = line1[mydic['VOID_ITEMS']]
u.RETURN_ITEMS = line1[mydic['RETURN_ITEMS']]
u.DISCOUNT_ITEMS = line1[mydic['DISCOUNT_ITEMS']]
u.OTH_ITEMS = line1[mydic['OTH_ITEMS']]
u.SALE_ITEMS = line1[mydic['SALE_ITEMS']]
u.MODIF_ITEMS = line1[mydic['MODIF_ITEMS']]
u.WASTE_ITEMS = line1[mydic['WASTE_ITEMS']]
u.TICKETCOUNT = line1[mydic['TICKETCOUNT']]
u.AVG_COST = line1[mydic['AVG_COST']]
u.VOIDSALES_TAX = line1[mydic['VOIDSALES_TAX']]
u.RETURNSALES_TAX = line1[mydic['RETURNSALES_TAX']]
u.DISCOUNTSALES_TAX = line1[mydic['DISCOUNTSALES_TAX']]
u.OVERRIDE_AMT_TAX = line1[mydic['OVERRIDE_AMT_TAX']]
u.OTHAMT_TAX = line1[mydic['OTHAMT_TAX']]
u.WASTEAMT_TAX = line1[mydic['WASTEAMT_TAX']]
u.SALESAMT_TAX = line1[mydic['SALESAMT_TAX']]
u.LAST_TRANS_TIME = line1[mydic['LAST_TRANS_TIME']]
session.add(u)
commint = commint+1
if commint>1000:
commint = commint %1000
session.commit() session.close() if __name__ == '__main__':
main()
至此,这一周的工作终于是结束了!从无到有,从没学过Python到现在写出这样的代码,仅仅过去了2周,期间查阅了InterBase和Firebird数据库,试验了无数次的导出导入,为了文件格式化也是想了许久,以前学Java时最讨厌的正则也无数次的试来试去……也算是掌握的差不多了,Python也对于基本语法掌握了个大概,也算是没白忙活额~~加油!!!
InterBase数据库迁移到MySQL(数据导入)的更多相关文章
- InterBase数据库迁移到MySQL(数据导出)
这篇我将记叙我的第二个脚本程序,这篇我使用InterBase数据库提供的“isql”命令来导出我所要的数据,但是由于“isql”命令没有直接导出数据的语句,说以我采用的是导入一个配置文件,在这个文件中 ...
- InterBase数据库迁移到MySQL(说明)
刚刚到公司1周便接到了第一个需求,进过了几天的沟通明白了是从gbk文件中恢复InterBase数据库,然后再将恢复到数据库中的数据导出到远程的MySQL数据库中,拿到需求先分步去看问题了,问题大致可分 ...
- InterBase数据库迁移到MySQL(恢复备份)
我拿到的是InterBase导出的“.gbk”后缀的数据库备份文件,目标是可以通过命令行的方式导入到指定的数据库中,在这个脚本中我使用了InterBase数据库中自带的“gbak”命令行来进行操作. ...
- Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具
Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具 1 kettle --第一次使用kettle玩迁移,有什么不足之处和建议,请大家指正和建议. ...
- Sqoop将mysql数据导入hbase的血与泪
Sqoop将mysql数据导入hbase的血与泪(整整搞了大半天) 版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: https://my.oschina.net/yunsh ...
- 使用sqoop把mysql数据导入hive
使用sqoop把mysql数据导入hive export HADOOP_COMMON_HOME=/hadoop export HADOOP_MAPRED_HOME=/hadoop cp /hive ...
- [转载]如何将OFBIZ(opentaps)默认数据库迁移至mysql((2
原文地址:如何将OFBIZ(opentaps)默认数据库迁移至mysql(利昂原创)作者:利昂 ofbiz自带的数据库是Derby,这是一种小型的适合与测试系统的数据库,但不适合在产品级系统中使用,所 ...
- MySQL数据导入导出方法与工具mysqlimport
MySQL数据导入导出方法与工具mysqlimport<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office ...
- 使用MapReduce将mysql数据导入HDFS
package com.zhen.mysqlToHDFS; import java.io.DataInput; import java.io.DataOutput; import java.io.IO ...
随机推荐
- 重温WCF之构建一个简单的WCF(一)(2)通过Windows Service寄宿服务和WCF中实现操作重载
参考地址:http://www.cnblogs.com/zhili/p/4039111.html 一.如何在Windows Services中寄宿WCF服务 第一步:创建Windows 服务项目,具体 ...
- 【翻译二十一】java-并发之分拆和合并
Fork/Join This section was updated to reflect features and conventions of the upcoming Java SE 8 rel ...
- Linggle: 英语写作学习搜索引擎
Linggle 搜索引擎是一个可用于英语写作的语法.句子工具,可帮助学习者分析更准确的英文写作建议,能够根据词性来推测短句和句子,可精准的分享出完整英文句子如何撰写. Linggle 是台湾学术团队研 ...
- 为什么接口类型可以直接new?
Runnable rn = new Runnable() { public void run() { } }; 实际相当于,jdk会自动生成一个匿名内部类,完成职责: class Anomymous ...
- ListView中每个item条目在被单击选中时能够高亮显示
在布局文件中设定: android:listSelector="@android:color/holo_red_light" 在代码中实现 listView.setSelector ...
- 在64位Win7中使用Navicat Premium 和PL\SQL Developer连接Oracle数据库备忘
最近接手了一个项目,服务器端数据库是oracle 11g 64位.由于主要工作不是开发,也不想在自己的电脑上安装庞大的oracle数据库,因此寻思着只通过数据库管理工具连接数据库进行一些常用的查询操作 ...
- 数字信号处理实验(六)——FIR滤波器的设计
一.四种线性相位FIR滤波器的振幅响应 1.自编函数 [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) 2.一个demo clea ...
- HDU 5867 Sparse Graph (2016年大连网络赛 I bfs+补图)
题意:给你n个点m条边形成一个无向图,问你求出给定点在此图的补图上到每个点距离的最小值,每条边距离为1 补图:完全图减去原图 完全图:每两个点都相连的图 其实就是一个有技巧的bfs,我们可以看到虽然点 ...
- Uva 725 Division
0.不要傻傻的用递归去构造出一个五位数来,直接for循环最小到最大就好,可以稍微剪枝一丢丢,因为最小的数是01234 从1234开始,因为倍数n最小为2 而分子是一个最多五位数,所以分母应该小于五万. ...
- 建立Maven工程时出错,Failure to transfer com.thoughtworks.xstream:xstream:jar:1.3.1
Failure to transfer com.thoughtworks.xstream:xstream:jar: from http://repo1.maven.org/maven2 was cac ...