Форум программистов, компьютерный форум, киберфорум
Python: Flask
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305

Почему не работает миграция? Flask

13.02.2020, 19:36. Показов 2482. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ранее в БД добавлялась таблица "authorization", миграция была выполнена успешно.

Сейчас необходимо добавить в БД новую таблицу "changes".

Скрипт миграции

Python
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
"""added changes table
 
Revision ID: ac73160418aa
Revises: 
Create Date: 2020-02-12 12:14:43.451000
 
"""
from alembic import op
import sqlalchemy as sa
 
 
# revision identifiers, used by Alembic.
revision = 'ac73160418aa'
down_revision = 'fb23259287eb'
branch_labels = None
depends_on = None
 
 
def upgrade():
    op.create_table(
        'changes',
        sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
        sa.Column('date', sa.Integer(), nullable=False),
        sa.Column('username', sa.String(50), nullable=False),
        sa.Column('signal', sa.Boolean(), nullable=False)
    )
 
 
def downgrade():
    op.drop_table('changes')
При выполнении команды
Bash
1
python runner.py db upgrade
вылетает исключение
Кликните здесь для просмотра всего текста
Python
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
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> fb23259287eb, added authorization table
Traceback (most recent call last):
  File "runner.py", line 41, in <module>
    manager.run()
  File "C:\Python27\lib\site-packages\flask_script\__init__.py", line 417, in run
    result = self.handle(argv[0], argv[1:])
  File "C:\Python27\lib\site-packages\flask_script\__init__.py", line 386, in handle
    res = handle(*args, **config)
  File "C:\Python27\lib\site-packages\flask_script\commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
  File "C:\Python27\lib\site-packages\flask_migrate\__init__.py", line 95, in wrapped
    f(*args, **kwargs)
  File "C:\Python27\lib\site-packages\flask_migrate\__init__.py", line 280, in upgrade
    command.upgrade(config, revision, sql=sql, tag=tag)
  File "C:\Python27\lib\site-packages\alembic\command.py", line 298, in upgrade
    script.run_env()
  File "C:\Python27\lib\site-packages\alembic\script\base.py", line 489, in run_env
    util.load_python_file(self.dir, "env.py")
  File "C:\Python27\lib\site-packages\alembic\util\pyfiles.py", line 98, in load_python_file
    module = load_module_py(module_id, path)
  File "C:\Python27\lib\site-packages\alembic\util\compat.py", line 239, in load_module_py
    mod = imp.load_source(module_id, path, fp)
  File "migrations\env.py", line 106, in <module>
    run_migrations_online()
  File "migrations\env.py", line 100, in run_migrations_online
    context.run_migrations()
  File "<string>", line 8, in run_migrations
  File "C:\Python27\lib\site-packages\alembic\runtime\environment.py", line 846, in run_migrations
    self.get_context().run_migrations(**kw)
  File "C:\Python27\lib\site-packages\alembic\runtime\migration.py", line 518, in run_migrations
    step.migration_fn(**kw)
  File "D:\project\uscada\uscada_web\migrations\versions\fb23259287eb_added_authorization_table.py", line 25, in upgrade
    sa.Column('status', sa.Boolean(), nullable=False)
  File "<string>", line 8, in create_table
  File "<string>", line 3, in create_table
  File "C:\Python27\lib\site-packages\alembic\operations\ops.py", line 1250, in create_table
    return operations.invoke(op)
  File "C:\Python27\lib\site-packages\alembic\operations\base.py", line 345, in invoke
    return fn(self, operation)
  File "C:\Python27\lib\site-packages\alembic\operations\toimpl.py", line 101, in create_table
    operations.impl.create_table(table)
  File "C:\Python27\lib\site-packages\alembic\ddl\impl.py", line 252, in create_table
    self._exec(schema.CreateTable(table))
  File "C:\Python27\lib\site-packages\alembic\ddl\impl.py", line 134, in _exec
    return conn.execute(construct, *multiparams, **params)
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 982, in execute
    return meth(self, multiparams, params)
  File "C:\Python27\lib\site-packages\sqlalchemy\sql\ddl.py", line 72, in _execute_on_connection
    return connection._execute_ddl(self, multiparams, params)
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1044, in _execute_ddl
    compiled,
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1250, in _execute_context
    e, statement, parameters, cursor, context
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1476, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "C:\Python27\lib\site-packages\sqlalchemy\util\compat.py", line 398, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1246, in _execute_context
    cursor, statement, parameters, context
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\default.py", line 581, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) table authorization already exists
[SQL:
CREATE TABLE authorization (
        id INTEGER NOT NULL,
        date INTEGER NOT NULL,
        username VARCHAR(50) NOT NULL,
        status BOOLEAN NOT NULL,
        PRIMARY KEY (id),
        CHECK (status IN (0, 1))
)
 
]
(Background on this error at: http://sqlalche.me/e/e3q8)

Ругается на то, что таблица authorization уже существует.

Нашел информацию, что необходимо установить в конфиг параметр include_schemas=True. Но это ничего не меняет.

env.py
Кликните здесь для просмотра всего текста
Python
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from __future__ import with_statement
 
import logging
from logging.config import fileConfig
 
from sqlalchemy import engine_from_config
from sqlalchemy import pool
 
from alembic import context
 
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
 
# Interpret the config file for Python logging.
# This line sets up loggers basically.
fileConfig(config.config_file_name)
logger = logging.getLogger('alembic.env')
 
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
from flask import current_app
config.set_main_option(
    'sqlalchemy.url', current_app.config.get(
        'SQLALCHEMY_DATABASE_URI').replace('%', '%%'))
target_metadata = current_app.extensions['migrate'].db.metadata
 
# other values from the config, defined by the needs of env.py,
# can be acquired:
# my_important_option = config.get_main_option("my_important_option")
# ... etc.
 
 
def run_migrations_offline():
    """Run migrations in 'offline' mode.
 
    This configures the context with just a URL
    and not an Engine, though an Engine is acceptable
    here as well.  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 = config.get_main_option("sqlalchemy.url")
    context.configure(
        url=url, target_metadata=target_metadata, literal_binds=True
    )
 
    with context.begin_transaction():
        context.run_migrations()
 
 
def run_migrations_online():
    """Run migrations in 'online' mode.
 
    In this scenario we need to create an Engine
    and associate a connection with the context.
 
    """
 
    # this callback is used to prevent an auto-migration from being generated
    # when there are no changes to the schema
    # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html
    def process_revision_directives(context, revision, directives):
        if getattr(config.cmd_opts, 'autogenerate', False):
            script = directives[0]
            if script.upgrade_ops.is_empty():
                directives[:] = []
                logger.info('No changes in schema detected.')
 
    connectable = engine_from_config(
        config.get_section(config.config_ini_section),
        prefix='sqlalchemy.',
        poolclass=pool.NullPool,
    )
 
    with connectable.connect() as connection:
        context.configure(
            connection=connection,
            target_metadata=target_metadata,
            process_revision_directives=process_revision_directives,
            include_schemas=True,
            **current_app.extensions['migrate'].configure_args
        )
 
        with context.begin_transaction():
            context.run_migrations()
 
 
if context.is_offline_mode():
    run_migrations_offline()
else:
    run_migrations_online()

В чем может быть проблема?

Python 2.7 x32
SQLite3
Flask 1.1.1
Flask-Migrate 2.5.2
Flask-SQLAlchemy 2.4.1
SQLAlchemy 1.3.13
alembic 1.4.0
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2020, 19:36
Ответы с готовыми решениями:

Почему не выполняется миграция?
Пытаюсь сделать миграцию. AppDbContext выглядит следующим образом : namespace DotaLB.Domain { public class AppDbContext :...

Почему не выполняется миграция?
Пытаюсь сделать миграцию. AppDbContext выглядит следующим образом : namespace DotaLB.Domain { public class AppDbContext :...

Flask голосовалака: почему здесь ошибка?
# coding: utf8 from flask import Flask, render_template, request import os app = Flask(__name__) poll_data = { ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.02.2020, 19:36
Помогаю со студенческими работами здесь

Не работает миграция
Создал класс User работал с ним . Нужно было добавить свойство public string Position { get; set; }. Создал миграцию и пытался обновить...

Не работает миграция EF 4.3.1
Через nuget устанавливаю EF 4.3.1 Там же в командной строке пишу PM&gt; Enable-Migrations а мне ошибка: ...

Прием json-объекта | Flask, Flask-Security, Telegram-bot
Здравствуйте, помогите , пожалуйста, Flask знаю не очень, но что-то смог, писал бота с бд и админкой, на вебхуке, но после того, как...

Подключить PostgreSQL к Flask API и передавать данные таблицы в flask
Нужна срочная и большая помощь, надеюсь только на вас. Есть Python+QT5 (PYQT5) приложение. В таблицу приложения (QTableWidget)...

Не работает debug в Flask
Пытаюсь запустить режим отладки, но в консоли показано, что debug off Нагуглил варианты app.debug = True app.run() ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru