Мне нужно взять объект метаданных SQLALchemy и создать его на MS SQL и Oracle. Это достаточно просто в ядре SQLAlchemy, см. Пример ниже. Но имена объектов должны быть в смешанном регистре на MS SQL и регистре по умолчанию на Oracle (все заглавные буквы). Он также смешивается с Oracle, что ожидается, когда имена в метаданных смешаны. Вручную это тривиально, просто есть отдельные определения метаданных, но это лишает цели наличия одного набора метаданных. Sqlalchemy - 1.3.8, python - 3.7.4.
"""
Create from metadata on MSSQL and Oracle
"""
import urllib
from sqlalchemy import * # pylint: disable=wildcard-import, unused-wildcard-import
params = urllib.parse.quote_plus(
"Driver={ODBC Driver 17 for SQL Server};Server=xxx\\xxx;Database=xxx;Trusted_Connection=yes"
)
print("mssql+pyodbc:///?odbc_connect=%s" % params)
mssqle = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params, echo=True)
oraclee = create_engine("oracle+cx_oracle://@xxx", echo=True)
metadata = MetaData()
t1 = Table(
"TableNumberOne",
metadata,
Column("id", Integer(), primary_key=True),
Column("ColumnNumberOne", String(50), index=True)
)
metadata.create_all(mssqle)
metadata.create_all(oraclee)
Я могу обойтись без этого. Я не уверен, что это охватывает все возможные ситуации.
for _tab in metadata.sorted_tables:
_tab.name = _tab.name.lower()
for _col in _tab.columns:
_col.name = _col.name.lower()
for _con in _tab.constraints:
if _con.name is not None:
_con.name = _con.name.lower()
for _idx in _tab.indexes:
if _idx.name is not None:
_idx.name = _idx.name.lower()