создавать объекты на MS SQL и Oracle из метаданных SQLAlchemy с разными регистрами имен - PullRequest
0 голосов
/ 29 января 2020

Мне нужно взять объект метаданных 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...