我在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)