в sqlalchemy отразить метаданные из MSSQL и применить к ошибке ORACLE - PullRequest
0 голосов
/ 04 мая 2018

У меня проблема с sqlalchemy.

Я хочу получить DDL базы данных в MSSQL, используя metadata.reflect () для создания той же таблицы в ORACLE. но когда применяются метаданные MSSQL для создания таблицы в ORACLE, он говорит мне об ошибке диалекта (BIGINT в MSSQL, он должен иметь NUMBER (19) в ORACLE, но он все еще использует BIGINT). думаю, что следует использовать диалект этого 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...