`
BucketLi
  • 浏览: 195117 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
5a76a659-f8e6-3bf3-b39a-8ae8f7a0f9d9
Percolator与分布...
浏览量:5674
社区版块
存档分类
最新评论

ORACLE表结构转化成MySQL表结构

 
阅读更多
主要用来做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()

分享到:
评论

相关推荐

    Oracle的表结构转成Mysql的表结构

    这将返回一个完整的MySQL创建表语句,用于创建指定表的等效MySQL表结构。 #### 总结 本文介绍的`fnc_table_to_mysql`函数能够有效地帮助用户从Oracle迁移到MySQL时,快速地生成对应的表结构。尽管存在一定的局限性...

    Oracle Sql语句转换成Mysql Sql语句

    OracleSqlConvert4MysqlSqlTool.java这个源码工具,根据描述,应该是实现了自动读取Oracle SQL语句,分析其结构,并根据MySQL的语法规则进行转换,然后将转换后的SQL语句保存到指定的目标文件中。这个工具简化了手动...

    oracle到mysql建表语句迁移

    oracle向mysql建表语句的迁移。 直接表结构的生成sql脚本

    Oracle数据库sql转换mysql数据库工具

    Oracle数据库和MySQL数据库是两种广泛使用的数据库管理系统,它们在数据存储、查询语法、数据库结构以及管理方式上存在显著差异。"Oracle数据库sql转换mysql数据库工具" 提供了解决这一问题的解决方案,允许用户将...

    Mysql转oracle工具

    这个工具专注于将MySQL的数据库结构和数据转换为Oracle数据库兼容的格式。下面将详细解释这个过程涉及的知识点。 1. **SQL语言的差异**: MySQL和Oracle都是SQL数据库管理系统,但它们对SQL语法的实现有所不同。...

    表结构转化成word 驱动家dbexportword for mysql

    "表结构转化成word 驱动家dbexportword for mysql" 是一个专为MySQL数据库设计的工具,它能够帮助用户将数据库中的表结构方便地导出为Word文档,极大地提高了工作效率,尤其是在需要将数据库设计报告或者数据模型...

    oracle Mysql相互转化的工具

    2. 表结构迁移:工具需要能够分析源数据库的表结构,包括字段名、数据类型、主键、外键、索引等,并在目标数据库中创建相应的结构。 3. 数据迁移:工具应支持大量数据的高效迁移,可能采用全量迁移或增量迁移的方式...

    ORACLE JAVA MYSQL类型转化对照

    ORACLE JAVA MYSQL类型转化对照

    mysql转化成sql server sql转化成mysql工具

    这时,可以使用如`mss2sql.rar`这样的工具,它通常能帮助用户自动化地将MySQL的表结构、数据、视图、存储过程等对象转换为SQL Server兼容的脚本,从而实现迁移。 转换过程一般包括以下步骤: 1. 数据库对象分析:...

    OracleTOMysql 转换工具

    6. **表结构转换**:转换工具应能识别Oracle的表结构,包括字段、索引、主键、外键等,并创建对应的MySQL表结构。 7. **权限和角色**:Oracle和MySQL的权限管理系统不同,转换工具需要考虑如何映射和转换用户的权限...

    excel根据宏指令生成MySQL、oracle、sqlserver数据库的SQL语句

    在excel中编写表结构后,可以在首页生成对应数据库脚本,包括MySQL、oracle、sqlserver,然后把该脚本在数据库中运行就可以了,还包括首页生成目录结构,有助于数据库表文档的编写

    强大简单的mysql迁移到oracle的工具

    NULL 博文链接:https://noobjava.iteye.com/blog/870011

    不同数据库之间的不同表结构的数据迁移

    首先,我们要理解不同的数据库管理系统(DBMS)如MySQL、Oracle、SQL Server、PostgreSQL等,它们在数据存储和表结构设计上可能存在显著差异。例如,对于NULL值的处理,有的系统允许NULL,有的则不支持;字段类型也...

    Powerdesigner把表结构导出成word.docx

    2. 在弹出的“Database Connection”(数据库连接)对话框中,选择要连接的数据库类型,例如MySQL、Oracle、SQL Server等。 3. 填写数据库连接参数,包括数据库服务器地址、端口号、数据库名称、用户名和密码。点击...

    oracle转换mysql工具2

    1. **数据迁移**:工具能够自动扫描Oracle数据库中的表结构、索引、视图等,并将其转换为MySQL兼容的格式。这包括处理Oracle特有的数据类型,如BFILE、RAW、LONG等,将其转化为MySQL可接受的数据类型。 2. **SQL...

    Convert Mysql to Oracle 4.0.zip

    描述中提到,该工具能够快速地将MySQL中的表结构(建表语句)转化为Oracle兼容的建表语句。在数据库迁移过程中,这样的转换工具至关重要,因为MySQL和Oracle的SQL语法存在差异,例如数据类型、约束条件、索引创建等...

    oracle,mysql表格转换mybatis相关文件

    Oracle和MySQL的表结构在设计上有所不同,包括字段类型、约束条件、索引等方面。在转换过程中,需要理解这两个数据库的数据类型对应关系,比如Oracle的NUMBER对应MySQL的DECIMAL,VARCHAR2对应VARCHAR等。同时,还要...

    MySql migration to Oracle Tool

    `dbxora.dll`和`dbxmys.dll`则是针对Oracle和MySQL的数据转换驱动,它们负责在两种数据库系统之间进行数据格式的转化和传输。`mysql2oraclecn.exe`是主执行程序,用户通过运行这个程序来启动迁移过程。 在实际迁移...

    导出数据库表结构(excel)程序

    在IT领域,数据库管理和数据...总的来说,"导出数据库表结构(excel)程序"是数据库管理和数据分析流程中一个实用的工具,它帮助用户将复杂的数据库信息转化为易于理解和操作的Excel文件,从而提高工作效率和协作能力。

    oracle迁移mysql工具使用方法[整理].pdf

    - **性能优化**:根据MySQL的最佳实践优化表结构和查询语句。 - **权限和安全**:设置MySQL数据库的用户权限,确保迁移后的安全性。 - **测试**:在实际迁移前,先在测试环境中进行迁移,验证数据的完整性和应用程序...

Global site tag (gtag.js) - Google Analytics