2015-03-19 8 views
6

Desidero modificare lo standard naming conventions dei vincoli impostati in Flask-SQLAlchemy, per facilitare le migrazioni con Alembic.Modifica delle convenzioni di denominazione dei vincoli in Flask-SQLAlchemy

Come Flask-SQLAlchemy crea la base dichiarativa (dove è possibile fornire convenzioni di denominazione) di per sé non sono sicuro di quale sia il modo migliore per farlo. Posso cambiare le convenzioni di denominazione dopo aver creato la base dichiarativa (ad esempio, quando ho creato l'oggetto Flask-SQLAlchemy) o devo creare una sottoclasse della classe SQLAlchemy? C'è un modo completamente diverso?

risposta

10

La versione 2.1 ha introdotto l'argomento metadata nell'estensione. Se tutto ciò che si desidera personalizzare sul modello di base sono i metadati, è possibile passare un'istanza personalizzata MetaData ad esso.

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', 
})) 

In precedenza, si potrebbe creare una sottoclasse della classe SQLAlchemy e sovrascrivere make_declarative_base. Funziona ancora ed è utile se è necessario personalizzare ulteriormente il modello di base.

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

Come di Flask-SQLAlchemy 2.1 è possibile effettuare le seguenti operazioni:

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)