Перейти к содержанию

Перенос

Инициализация базы данных

Обратите внимание, что во всех примерах предполагается, что база данных уже существует.

Если это не так, и вам нужно создать таблицу, то это очень просто, потому что Ormar использует sqlchemy для построения базовых таблиц.

Все, что вам нужно сделать, это вызвать create_all (), как в приведенном ниже примере

1
2
3
4
5
Sqimport alchemy
# get your databases url in sqlchemy format - same as used with databases instance used in Model definition
engine = sqlalchemy. create_engine ("sqlite://test.db")
Это значит быть метаданными, которые используются в ормарских модулях
metadata. create_all (engine)

Вы также можете создать отдельные таблицы, которые будут доступны в объекте ormar.ormar_config.

1
2
3
4
5
Sqimport alchemy
# get your databases url in sqlchemy format - same as used with databases instance used in Model definition
engine = sqlalchemy.create_engine ("sqlite://test.db")
# Artist is an ormar model from previouses
Artist.ormar_config.table.create(engine)

!!!Предупредите, что вы создаёте таблицу только один раз, поэтому используйте консоль Python или удалите скрипты из производственного кода после первого использования.

Использование дистилляторов

Как и в случае с таблицами, используйте alembic, так как мы переносим таблицы на основе sqlalchemy.

Инициализация

Используйте командную строку для воспроизведения этого простого примера.

1
2
3
Alembic init alembic
Alembic revision -autogenerate -m "Made Some changes"
Alembic Upgrade head

Пример файла env.py

Простой пример миграции дистиллятора должен быть аналогичен:

Если ваша структура приложения выглядит следующим образом:

1
2
3
4
5
-> app
    -> alembic (initialized folder - so run alembic init alembic inside app folder)
    >> Модули (here are the models)
      ->_init__.py
      >> my_models.py

Ваш файл env.py(в папке alembic) может быть похож на:

 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
Из sqlalchemy import create_engine

Импортный контекст Alembic Import
Import sys, os

# add app folder to system path (alternative is running it from parent folder with python -m..)
myPath = os.path.dirname(os.path.abspath (__file__))
sys.path.insert(0, myPath + '/..././')

This is the Alembic Config object, which provides
# Access to the Values within the .ini file in use.
config = config

# Interpret the config file for Python Logging.
# This line sets up loggers basically
fileConfig(config.config_file_name)

# add your model's MetaData object here (the one used in ormar)
# for 'autogenerate' support
Из app.models.my import metadata
target_metadata = metadata


# set your url here or import from settings
# note that by default url is in saved sqlachemy.url variable in alembic.ini file
URL = "sqlite://test.db"


def run_migrations_offline ():
    "Run migrations in 'offline' mode".

    This configures the context with just a URL
    И не только двигатель, но и не двигатель.
    Здесь вы можете найти все необходимое. By Skipping the Engine Creation
    We Don't Even need a DBAPI to Be available.

    Calls to context.execute() here emit the given string to the
    script output.

    """
    Конфигурация (
        url=URL,
        target_metadata = target_metadata
        literal_binds =True,
        dialect_opts ={"paramstyle": "named"},
        Если вы используете UUID поле set также этот парам
        #prefix has to sqlalchemy import name in alembic
        # that can be set by sqalchemy_moduel_prefix option (default 'sa')
        user_modue_prefix ='sa.'
    )

    with context.begin_transaction ():
        context.run ()


def run_migrations_online ():
    "Run migrations in 'online' mode".

    In this scenario we need to create an Engine
    И согласие с контекстом.

    """
    connectable = create_engine (URL)

    connectable.connect() as connection:
        Конфигурация (
            connection=connection,
            target_metadata = target_metadata
            Если вы используете UUID поле set также этот парам
            #prefix has to sqlalchemy import name in alembic
            # that can be set by sqalchemy_moduel_prefix option (default 'sa')
            user_modue_prefix ='sa.'
        )

        with context.begin_transaction ():
            context.run ()


if context.is ():
    Run_migrations_offline ()
else:
    Run_migrations_online ()

Исключить таблицы

Вы также можете включить/исключить конкретные таблицы с помощью параметра include_object, который передается в context.configure. Это должна быть функция, возвращающая True/False для данного объекта.

Пример функции исключает таблицу, имя которой начинается с data_, если она не является "data_jobs":

1
2
3
4
5
def include (object, name, type_, reflected, compare_to):
    if name and name.startswith ('data_') and name not in ['data_jobs']:
        Возврат Ложь

    Возвращение True

!!!Обратите внимание, что параметры функции include_objects (вы можете изменить имя) обязательны и определены в alembic, чтобы проверить их эффективность. Проверьте документ alembic

Затем передайте его в контекст (онлайн и оффлайн):

1
2
3
4
5
6
7
8
Конфигурация (
        url=URL,
        target_metadata = target_metadata
        literal_binds =True,
        dialect_opts ={"paramstyle": "named"},
        user_modue_prefix ='sa.',
        include =include object
    )

!!!info Вы можете прочитать больше информации о создании, изменении и миграции таблиц в документации по созданию таблицы sqlchemy.