У меня проблема с 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)