2
votes

Comment utiliser SQLAlchemy Utils dans un modèle SQLAlchemy

J'essaie de créer un modèle utilisateur qui utilise l'UUID comme clé primaire:

from src import create_app

from src.db import db

from flask_migrate import Migrate

# Models

from src.user.models.user import User

app = create_app()

migrate = Migrate(app, db)`

Mais lorsque je génère les migrations, je reçois:

File "/home/pc/Downloads/project/auth/venv/lib/python3.6/site-packages/alembic/runtime/environment.py", line 836, in run_migrations
    self.get_context().run_migrations(**kw)
  File "/home/pc/Downloads/project/auth/venv/lib/python3.6/site-packages/alembic/runtime/migration.py", line 330, in run_migrations
step.migration_fn(**kw)
  File "/home/pc/Downloads/project/auth/migrations/versions/efae4166f832_.py", line 22, in upgrade
    sa.Column('id', sqlalchemy_utils.types.uuid.UUIDType(length=16), nullable=False),
NameError: name 'sqlalchemy_utils' is not defined`


0 commentaires

3 Réponses :


5
votes

Il vous suffit d'ajouter:

import sqlalchemy_utils

à votre script.py.mako dans le dossier des migrations


1 commentaires

J'ai fait quelque chose de très similaire - ajoutez cette ligne en haut de mon fichier migrations / versions / 9d34543545.py



1
votes

Merci, Marco, mais je l'ai déjà corrigé. J'ai mis l'importation import sqlalchemy_utils dans env.py et script.py.mako , j'ai également mis la fonction suivante:

context.configure(
    ...,
    render_item=render_item,
    ...
)

Dans le env.py , et dans le même fichier, j'ai défini render_item = render_item dans la fonction run_migrations_online :

def render_item(type_, obj, autogen_context):
    """Apply custom rendering for selected items"""

    if type_ == "type" and isinstance(obj, sqlalchemy_utils.types.uuid.UUIDType):
        # Add import for this type
        autogen_context.imports.add("import sqlalchemy_utils")

        autogen_context.imports.add("import uuid")

        return "sqlalchemy_utils.types.uuid.UUIDType(), default=uuid.uuid4"

    # Default rendering for other objects
    return False

J'ai fait des recherches pour le faire automatiquement, mais je n'ai rien trouvé qui puisse m'aider.

L'ordre des opérations compte:

  1. exporter FLASK_APP = manage.py

  2. flask db init

  3. Suivez le didacticiel ci-dessus

  4. migration de la base de données du flacon

  5. mise à jour de la base de données du flacon


0 commentaires

0
votes

Ajoutez la ligne import sqlalchemy_utils au fichier migrations / versions / {hash} _my_comment.py nouvellement créé. Cependant, cela ne résoudra le problème que pour cette étape spécifique de la migration. Si vous pensez que vous allez apporter beaucoup de changements aux colonnes qui font référence à sqlalchemy_utils , vous devriez probablement faire quelque chose de plus robuste comme la suggestion de Walter. Même dans ce cas, il semble que vous deviez peut-être ajouter du code pour gérer correctement chaque type de colonne que vous finirez par utiliser.

NB: malgré la suggestion à plusieurs endroits d'ajouter simplement la ligne d'importation au fichier script.py.mako , cela n'a pas fonctionné pour moi.


0 commentaires