2015-03-19 12 views
6

Chciałbym zmienić standard naming conventions ograniczeń, które są ustawione w Flask-SQLAlchemy, aby ułatwić migracje z Alembic.Zmiana konwencji nazewnictwa wiązań w Flask-SQLAlchemy

Jako że Flask-SQLAlchemy tworzy samą deklaratywną bazę (gdzie można podać konwencje nazewnictwa) samodzielnie, nie jestem pewien, co robi najlepiej. Czy mogę zmienić konwencje nazewnictwa po utworzeniu bazy deklaratywnej (np. Po utworzeniu obiektu Flask-SQLAlchemy) lub czy muszę podklasować klasę SQLAlchemy? Czy jest zupełnie inny sposób?

Odpowiedz

10

Wersja 2.1 wprowadziła argument metadata do rozszerzenia. Jeśli wszystko, co chcesz dostosować do modelu podstawowego, to metadane, możesz przekazać mu niestandardową instancję MetaData.

db = SQLAlchemy(metadata=MetaData(naming_convention={ 
    'pk': 'pk_%(table_name)s', 
    'fk': 'fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s', 
    'ix': 'ix_%(table_name)s_%(column_0_name)s', 
    'uq': 'uq_%(table_name)s_%(column_0_name)s', 
    'ck': 'ck_%(table_name)s_%(constraint_name)s', 
})) 

Wcześniej byś podklasy klasy SQLAlchemy i zastąpić make_declarative_base. To nadal działa i jest użyteczne, jeśli potrzebujesz dalszego dostosowania modelu podstawowego.

from flask_sqlalchemy import SQLAlchemy as BaseSQLAlchemy, Model, _BoundDeclarativeMeta, _QueryProperty 
from sqlalchemy import MetaData 

class SQLAlchemy(BaseSQLAlchemy): 
    def make_declarative_base(self): 
     metadata = MetaData(naming_convention={ 
      'pk': 'pk_%(table_name)s', 
      'fk': 'fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s', 
      'ix': 'ix_%(table_name)s_%(column_0_name)s', 
      'uq': 'uq_%(table_name)s_%(column_0_name)s', 
      'ck': 'ck_%(table_name)s_%(constraint_name)s', 
     }) 
     base = declarative_base(metadata=metadata, cls=Model, name='Model', metaclass=_BoundDeclarativeMeta) 
     base.query = _QueryProperty(self) 
     return base 
3

Jak Kolba-SQLAlchemy 2.1 można wykonać następujące czynności:

from flask_sqlalchemy import SQLAlchemy 
from sqlalchemy import MetaData 

metadata = MetaData(
    naming_convention={ 
    'pk': 'pk_%(table_name)s', 
    'fk': 'fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s', 
    'ix': 'ix_%(table_name)s_%(column_0_name)s', 
    'uq': 'uq_%(table_name)s_%(column_0_name)s', 
    'ck': 'ck_%(table_name)s_%(constraint_name)s', 
    } 
) 
db = SQLAlchemy(metadata=metadata)