在sqlalchemy中,反映来自MSSQL的元数据并应用于ORACLE错误

时间:2018-05-04 03:01:29

标签: python-3.x sqlalchemy etl

我在sqlalchemy遇到了问题。

我想使用metadata.reflect()在MSSQL中获取数据库DDL,以在ORACLE中创建相同的表。 但是当应用MSSQL元数据在ORACLE中创建表时,它告诉我方言错误(在MSSQL中BIGINT,在ORACLE中它应该是NUMBER(19)但它仍然使用BIGINT)。在sqlalchemy中,当调用create()并绑定引擎时,我认为它应该使用这个enigne的方言。这是对的吗?

示例代码中有任何问题吗?非常感谢。

from sqlalchemy import *
import cx_Oracle
import pyodbc

# create engine, both engine connections are OK
engine_dest = sqlalchemy.create_engine('oracle+cx_oracle://xxxxxx', echo=True)
engine_src = sqlalchemy.create_engine('mssql+pyodbc://xxxxx', echo=True)

tables = ['SecuMain','tableB']

metadata_src = sqlalchemy.MetaData()
# reflect databases in engine_src, and store in metadata_src
metadata_src.reflect(bind=engine_src, only=tables)

for t in tables:
    tbl = metadata_src.tables[t]

    ## error occur. it tell me that, statements in MSSQL dialect cannot run in ORACLE dialect
    tbl.create(bind=engine_dest)
    ## sqlalchemy.exc.DatabaseError: (cx_Oracle.DatabaseError) ORA-00902: invalid datatype [SQL: '\nCREATE TABLE "SecuMain" (\n\t"ID" BIGINT NOT NULL
    ## cx_Oracle.DatabaseError: ORA-00902: invalid datatype

输出:

    raceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
    context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 507, in do_execute
    cursor.execute(statement, parameters)
cx_Oracle.DatabaseError: ORA-00902: invalid datatype

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "tmp.py", line 226, in <module>
    target_table.create(engine_dest, checkfirst=True)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/sql/schema.py", line 778, in create
    checkfirst=checkfirst)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1940, in _run_visitor
    conn._run_visitor(visitorcallable, element, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1549, in _run_visitor
    **kwargs).traverse_single(element)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/sql/visitors.py", line 121, in traverse_single
    return meth(obj, **kw)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/sql/ddl.py", line 791, in visit_table
    include_foreign_key_constraints=include_foreign_key_constraints
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 948, in execute
    return meth(self, multiparams, params)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/sql/ddl.py", line 68, in _execute_on_connection
    return connection._execute_ddl(self, multiparams, params)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1009, in _execute_ddl
    compiled
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context
    context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception
    exc_info
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 203, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 186, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
    context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 507, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.DatabaseError: (cx_Oracle.DatabaseError) ORA-00902: invalid datatype [SQL: '\nCREATE TABLE "SecuMain" (\n\t"ID" BIGINT NOT NULL, \n\t"InnerCode" INTEGER NOT NULL, \n\t"CompanyCode" INTEGER, \n\t"SecuCode" VARCHAR(10 CHAR), \n\t"ChiName" VARCHAR(200 CHAR), \n\t"ChiNameAbbr" VARCHAR(100 CHAR), \n\t"EngName" VARCHAR(200 CHAR), \n\t"EngNameAbbr" VARCHAR(50 CHAR), \n\t"SecuAbbr" VARCHAR(100 CHAR), \n\t"ChiSpelling" VARCHAR(50 CHAR), \n\t"SecuMarket" INTEGER, \n\t"SecuCategory" INTEGER, \n\t"ListedDate" DATETIME, \n\t"ListedSector" INTEGER, \n\t"ListedState" INTEGER, \n\t"XGRQ" DATETIME NOT NULL, \n\t"JSID" BIGINT NOT NULL, \n\t"ISIN" VARCHAR(20 CHAR)\n)\n\n'] (Background on this error at: http://sqlalche.me/e/4xp6)

0 个答案:

没有答案