Migration par
Initialisation de base de données
Notez que tous les exemples supposent que vous avez déjà une base de données.
Si ce n'est pas le cas et que vous devez créer des tables, c'est très simple, car ormar utilise sqlalchemy pour la construction de tables sous-jacentes.
Tout ce que vous avez à faire est d'appeler create_all() comme dans l'exemple ci-dessous.
| Import sqlalchemy
#obtenir l'URL de votre base de données dans sqlalchemy format - same as used with databases instance used in Model Definition
engine = sqlalchemy.create_engine("sqlite://test.db")
# note que cela a été fait pour être la même métadonnée qui a été utilisée dans la définition des modèles d'ordre
metadata.create_all(engine)
|
Vous pouvez également créer une table unique, la table sqlalchemy étant exposée dans l'objet ormar.ormar_config.
| Import sqlalchemy
#obtenir l'URL de votre base de données dans sqlalchemy format - same as used with databases instance used in Model Definition
engine = sqlalchemy.create_engine("sqlite://test.db")
# Artist est un modèle d'ordre issu des exemples précédents
Artist.ormar_config.table.create(engine)
|
!!!Attention, vous ne devez créer la table qu 'une seule fois, utilisez donc la console python ou supprimez le script du code de production après la première utilisation.
Utilisation du distillateur
Comme pour les tables, puisque nous migrons les tables en fonction de sqlalchemy, utilisez alembic.
Initialisation par
Utilisez la ligne de commande pour recréer cet exemple minimaliste.
| ALEMBIC init ALEMBIC
Révision alambique--autogénérate-m "fait quelques changements"
tête de grade supérieur alambic
|
Exemple de fichier env.py
Un exemple simple de migration de distillateur devrait ressembler à:
Si votre application est structurée comme suit:
| -> App
-> alembic (dossier initialisé-alors exécutez le dossier d'application elembic init alembic inside)
-> modèles (voici les modèles)
-> __init__.py
-> my_models.py
|
Votre fichier env.py(dans le dossier alembic) peut ressembler à:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 | from logging.config import fileConfig
de sqlalchemy import create_engine
du contexte d'importation alambiqué
import sys, os
# add app folder to system path (l'alternative est en cours d'exécution à partir de folder parent avec python -m ...)
myPath = os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, myPath + '/../.../')
#Ceci est l'objet de Config alambic, qui fournit
#accéder aux valeurs dans le fichier.ini utilisé.
config = contexte.config
#Interpréter le fichier de config pour le logging Python.
# This line set up loggers basiquement.
fileConfig(config.config_file_name)
#ajouter l'objet MetaData de votre modèle ici (celui utilisé en ordre)
#pour le support « autogénérateur »
de app.models.my_models import metadata
target_metadata = metadata
#définissez votre URL ici ou import from settings
# note que par défaut url est dans sqlachemy sauvé.url variable dans le fichier alembic.ini
URL = "sqlite://test.db"
def run_migrations_offline():
"""Exécuter des migrations en mode 'offline'.
Cette configuration du contexte avec juste une URL
Et non pas un moteur, mais un moteur est accessible
Voici comme bien. par skipping la création du moteur
Nous n'avons pas besoin d'une DBAPI pour être disponible.
Appels à context.execute() ici émet la chaîne de dons à la
Le script output.
"""
contexte.configure(
url=URL,
target_metadata=target_metadata,
littéral_binds=True,
dialect_opts={"paramstyle": "named"},
#Si vous utilisez le champ UUID défini aussi ce paragraphe
#le préfixe a été mis en correspondance avec le nom d'import sqlalchemy en alambic
# that can be set by sqlalchemy_module_option de préfixe (default 'sa.')
user_module_prefix ='sa'
)
avec context.begin_transaction():
context.run_migrations()
def run_migrations_online():
"""Exécuter des migrations en mode" online ".
Dans ce scénario, nous devons créer un moteur
Et associer une connection avec le contexte.
"""
connectable = create_engine(URL)
avec connectable.connect() comme connection:
contexte.configure(
connection=connection,
target_metadata=target_metadata,
#Si vous utilisez le champ UUID défini aussi ce paragraphe
#le préfixe a été mis en correspondance avec le nom d'import sqlalchemy en alambic
# that can be set by sqlalchemy_module_option de préfixe (default 'sa.')
user_module_prefix ='sa'
)
avec context.begin_transaction():
context.run_migrations()
if context.is_offline_mode():
run_migrations_offline()
Else:
run_migrations_online()
|
Vous pouvez également inclure/exclure des tables spécifiques en utilisant le paramètre include_object passé à context.configure Cela devrait être une fonction qui renvoie True/False pour un objet donné.
L'exemple de fonction exclut les tables dont le nom commence par data_, sauf si c'est "data_jobs":
| def include_object(object, name, type_, reflected, compare_to):
Si nom et prénom.startswith('data_') et nom non dans ['data_jobs']:
return False
return True
|
!!!Notez que les arguments de fonction include_objects (vous pouvez changer le nom) sont obligatoires et définis dans alembic pour vérifier ce qu 'ils font, veuillez consulter la documentation alembic
Il est ensuite transmis dans le contexte (en ligne et hors ligne):
| contexte.configure(
url=URL,
target_metadata=target_metadata,
littéral_binds=True,
dialect_opts={"paramstyle": "named"},
user_module_prefix ='sa.',
include_object=include_object
)
|
!!!info Vous pouvez en savoir plus sur la création, la modification et la migration de tables dans la documentation sur la création de tables sqlalchemy.