主要用来做ORACLE到MySQL的结构迁移。
#! /usr/bin/env python
import cx_Oracle
def get_ora_conn(ip, port ,sid, user, password):
dsn = cx_Oracle.makedsn(ip, port, sid)
conn = cx_Oracle.connect(user, password, dsn)
return conn
def test():
conn = get_ora_conn("127.0.0.1", 1521, "orcl", "user", "ssss")
##conn = get_ora_conn("127.0.0.1", 1521, "orcl", "user", "ssss")
#cols, inds, cons = get_table_meta(conn, "user", "table")
#gene_mysql_ddl('test', cols, inds, cons)
table_schema = "user"
tabs = get_tables(conn, table_schema)
for tab in tabs:
get_table_ddl(conn, table_schema, tab[0])
def get_table_ddl(db_conn, table_schema, table_name):
cols, inds, cons = get_table_meta(db_conn, table_schema, table_name)
gene_mysql_ddl(table_name, cols, inds, cons)
def get_tables(db_conn, table_schema):
sql = "select table_name from dba_tables where owner=:owner"
cur = db_conn.cursor()
cur.execute(sql, {"owner": table_schema})
tabs = cur.fetchall()
return tabs
def get_table_meta(db_conn, table_schema, table_name):
#table
#index
#constraint
#foreign key
sql_col = """
select table_name, column_name , data_type, data_length, data_precision, data_scale, nullable, data_default
from dba_tab_columns
where owner = :owner
and table_name = :table_name
order by column_id
"""
cur = db_conn.cursor()
cur.execute(sql_col, {'owner': table_schema, 'table_name': table_name})
tab_cols = cur.fetchall()
inds = get_table_indexes(db_conn, table_schema, table_name)
cons = get_table_pkuk(db_conn, table_schema, table_name)
return tab_cols, inds, cons
def get_table_pkuk(db_conn, table_schema, table_name):
sql = """
select constraint_name, CONSTRAINT_TYPE
from dba_constraints
where owner = :owner
and table_name = :table_name
and constraint_type in ('P', 'U')
"""
sql2 = """
select column_name
from dba_cons_columns
where owner = :owner
and table_name = :table_name
and constraint_name = :constraint_name
order by position
"""
cur = db_conn.cursor()
cur.execute(sql, {'owner': table_schema, 'table_name': table_name})
cons = cur.fetchall()
ret = []
for cons_name, cons_type in cons:
cur.execute(sql2, {'owner':table_schema, 'table_name':table_name,'constraint_name':cons_name})
cons_cols = cur.fetchall()
cons_expr = ",".join(i[0] for i in cons_cols)
ret.append([cons_name, cons_type, cons_expr])
return ret
def get_table_indexes(db_conn, table_schema, table_name):
sql = """
select index_name, index_type, uniqueness from dba_indexes where owner = :owner and table_name = :table_name
"""
sql2 = """
select column_name
from dba_ind_columns
where index_owner = :index_owner
and index_name = :index_name
and table_owner = :table_owner
and table_name = :table_name
order by COLUMN_POSITION
"""
cur = db_conn.cursor()
cur.execute(sql, {'owner': table_schema, 'table_name': table_name})
indexes = cur.fetchall()
ret = []
for index_name, index_type, uniqueness in indexes:
cur.execute(sql2, {'table_owner':table_schema, 'index_owner': table_schema, 'table_name': table_name, 'index_name': index_name})
ind_cols = cur.fetchall()
ind_exp = ",".join((i[0] for i in ind_cols))
ret.append([index_name, index_type, uniqueness, ind_exp])
return ret
#FBI
#DBA_IND_EXPRESSIONS
def get_table_comments(db_conn, table_schema, table_name):
sql_tab_comments = "select comment from dba_tab_comments where owner = :owner and table_name = :table_name"
sql_col_comments = "select column_name, comment from dba_col_comments where owner = :owner and table_name = :table_name"
def gene_mysql_ddl(table_name, tab_cols, inds, cons):
ddl = "create table %s (" % table_name
sep = "\n "
for c in tab_cols:
col = map_col_type(c)
ddl = ddl + sep + col
sep = ",\n "
added_inds = {}
for cons_name, cons_type, cons_expr in cons:
if cons_type == 'P':
ddl = ddl + sep + "primary key (%s)" % cons_expr
added_inds[cons_expr] = 1
elif cons_type == 'U':
ddl = ddl + sep + "unique key (%s)" % cons_expr
added_inds[cons_expr] = 1
for index_name, index_type, uniqueness, index_exp in inds:
if index_exp in added_inds:
continue
if uniqueness == 'UNIQUE':
ddl = ddl + sep + "unique key %s( %s )" % (index_name, index_exp)
else:
ddl = ddl + sep + "key %s( %s )" % (index_name, index_exp)
ddl = ddl + " \n) engine=innodb default charset=utf8;"
print ddl
#type mapping: number
def map_col_type(c):
(table_name, column_name, data_type, data_length, data_precision, data_scale, nullable, data_default) = c
if data_type == 'NUMBER':
if data_precision != None and data_scale != None:
if data_scale > 30:
data_scale = 30
mapped_col = "decimal(%d,%d)" % (data_precision, data_scale)
elif data_scale != None:
if data_scale > 30:
data_scale = 30
mapped_col = "decimal(38,%d)" % (data_scale)
else:
mapped_col = "bigint"
elif data_type == 'VARCHAR2' or data_type == 'VARCHAR':
mapped_col = "varchar(%d)" % data_length
elif data_type == 'CLOB':
mapped_col = 'text'
elif data_type == 'DATE':
mapped_col = 'datetime'
elif data_type == 'BLOB':
mapped_col = 'binary'
elif data_type == 'CHAR':
mapped_col = 'char(%d)' % data_length
else:
mapped_col = data_type
if nullable == 'N':
mapped_col = mapped_col + ' not null'
if data_default != None:
mapped_col = mapped_col + " default '" + data_default + "'"
return "%s %s" % (column_name, mapped_col)
if __name__ == "__main__":
test()
分享到:
相关推荐
这将返回一个完整的MySQL创建表语句,用于创建指定表的等效MySQL表结构。 #### 总结 本文介绍的`fnc_table_to_mysql`函数能够有效地帮助用户从Oracle迁移到MySQL时,快速地生成对应的表结构。尽管存在一定的局限性...
OracleSqlConvert4MysqlSqlTool.java这个源码工具,根据描述,应该是实现了自动读取Oracle SQL语句,分析其结构,并根据MySQL的语法规则进行转换,然后将转换后的SQL语句保存到指定的目标文件中。这个工具简化了手动...
oracle向mysql建表语句的迁移。 直接表结构的生成sql脚本
Oracle数据库和MySQL数据库是两种广泛使用的数据库管理系统,它们在数据存储、查询语法、数据库结构以及管理方式上存在显著差异。"Oracle数据库sql转换mysql数据库工具" 提供了解决这一问题的解决方案,允许用户将...
这个工具专注于将MySQL的数据库结构和数据转换为Oracle数据库兼容的格式。下面将详细解释这个过程涉及的知识点。 1. **SQL语言的差异**: MySQL和Oracle都是SQL数据库管理系统,但它们对SQL语法的实现有所不同。...
"表结构转化成word 驱动家dbexportword for mysql" 是一个专为MySQL数据库设计的工具,它能够帮助用户将数据库中的表结构方便地导出为Word文档,极大地提高了工作效率,尤其是在需要将数据库设计报告或者数据模型...
2. 表结构迁移:工具需要能够分析源数据库的表结构,包括字段名、数据类型、主键、外键、索引等,并在目标数据库中创建相应的结构。 3. 数据迁移:工具应支持大量数据的高效迁移,可能采用全量迁移或增量迁移的方式...
ORACLE JAVA MYSQL类型转化对照
这时,可以使用如`mss2sql.rar`这样的工具,它通常能帮助用户自动化地将MySQL的表结构、数据、视图、存储过程等对象转换为SQL Server兼容的脚本,从而实现迁移。 转换过程一般包括以下步骤: 1. 数据库对象分析:...
6. **表结构转换**:转换工具应能识别Oracle的表结构,包括字段、索引、主键、外键等,并创建对应的MySQL表结构。 7. **权限和角色**:Oracle和MySQL的权限管理系统不同,转换工具需要考虑如何映射和转换用户的权限...
在excel中编写表结构后,可以在首页生成对应数据库脚本,包括MySQL、oracle、sqlserver,然后把该脚本在数据库中运行就可以了,还包括首页生成目录结构,有助于数据库表文档的编写
NULL 博文链接:https://noobjava.iteye.com/blog/870011
首先,我们要理解不同的数据库管理系统(DBMS)如MySQL、Oracle、SQL Server、PostgreSQL等,它们在数据存储和表结构设计上可能存在显著差异。例如,对于NULL值的处理,有的系统允许NULL,有的则不支持;字段类型也...
2. 在弹出的“Database Connection”(数据库连接)对话框中,选择要连接的数据库类型,例如MySQL、Oracle、SQL Server等。 3. 填写数据库连接参数,包括数据库服务器地址、端口号、数据库名称、用户名和密码。点击...
1. **数据迁移**:工具能够自动扫描Oracle数据库中的表结构、索引、视图等,并将其转换为MySQL兼容的格式。这包括处理Oracle特有的数据类型,如BFILE、RAW、LONG等,将其转化为MySQL可接受的数据类型。 2. **SQL...
描述中提到,该工具能够快速地将MySQL中的表结构(建表语句)转化为Oracle兼容的建表语句。在数据库迁移过程中,这样的转换工具至关重要,因为MySQL和Oracle的SQL语法存在差异,例如数据类型、约束条件、索引创建等...
Oracle和MySQL的表结构在设计上有所不同,包括字段类型、约束条件、索引等方面。在转换过程中,需要理解这两个数据库的数据类型对应关系,比如Oracle的NUMBER对应MySQL的DECIMAL,VARCHAR2对应VARCHAR等。同时,还要...
`dbxora.dll`和`dbxmys.dll`则是针对Oracle和MySQL的数据转换驱动,它们负责在两种数据库系统之间进行数据格式的转化和传输。`mysql2oraclecn.exe`是主执行程序,用户通过运行这个程序来启动迁移过程。 在实际迁移...
在IT领域,数据库管理和数据...总的来说,"导出数据库表结构(excel)程序"是数据库管理和数据分析流程中一个实用的工具,它帮助用户将复杂的数据库信息转化为易于理解和操作的Excel文件,从而提高工作效率和协作能力。
- **性能优化**:根据MySQL的最佳实践优化表结构和查询语句。 - **权限和安全**:设置MySQL数据库的用户权限,确保迁移后的安全性。 - **测试**:在实际迁移前,先在测试环境中进行迁移,验证数据的完整性和应用程序...