繁体   English   中英

flask db 迁移 - OperationalError

[英]flask db migrate - OperationalError

我正在尝试使用 flask_migrate 向我的 flask 数据库添加一个新列。 但是,当我尝试迁移时,它会返回错误。 我几乎完成了迁移的每一步; 安装 flask_migrate,初始化 flask_migrate,执行 flask db init 以创建迁移文件夹。

这是我的初始化.py 文件

import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from flask_migrate import Migrate

app = Flask(__name__)
db = SQLAlchemy(app)
bcrypt = Bcrypt(app)
migrate = Migrate(app, db)

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'admin_login'

app.config['SECRET_KEY'] = os.environ.get('BLOG_SECRET_KEY')
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('YVES_LETTERS_DATABASE_URI')


from letters import routes

models.py 文件(视图列是我要添加到数据库的新列)

from letters import db
from flask_login import UserMixin
from datetime import datetime

class Data(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text(), nullable=False)
    author = db.Column(db.String(20), nullable=False)
    status = db.Column(db.Integer, nullable=False)
    date_added = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    views = db.Column(db.Integer, nullable=False, default=0)

    def __repr__(self):
        return f'id: {self.id}, title: {self.title}, author: {self.author}, date: {self.date_added}'

错误消息

C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\flask_sqlalchemy\__init__.py:852: UserWarning: Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. Defaulting SQLALCHEMY_DATABASE_URI to "sqlite:///:memory:".
  'Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. '
C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\flask_sqlalchemy\__init__.py:873: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
Traceback (most recent call last):
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\engine\base.py", line 1803, in _execute_context
    cursor, statement, parameters, context
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\engine\default.py", line 732, in do_execute
    cursor.execute(statement, parameters)
sqlite3.OperationalError: no such column: data.views

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\USER\anaconda3\envs\flask_env\Scripts\flask-script.py", line 9, in <module>
    sys.exit(main())
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\flask\cli.py", line 967, in main
    cli.main(args=sys.argv[1:], prog_name="python -m flask" if as_module else None)
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\flask\cli.py", line 586, in main
    return super(FlaskGroup, self).main(*args, **kwargs)
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\click\core.py", line 782, in main
    rv = self.invoke(ctx)
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\click\core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\click\core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\click\core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\click\core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\click\decorators.py", line 21, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\flask\cli.py", line 425, in decorator
    with __ctx.ensure_object(ScriptInfo).load_app().app_context():
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\flask\cli.py", line 388, in load_app
    app = locate_app(self, import_name, name)
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\flask\cli.py", line 240, in locate_app
    __import__(module_name)
  File "C:\Users\USER\Documents\yves-letters-2\run.py", line 1, in <module>
    from letters import app
  File "C:\Users\USER\Documents\yves-letters-2\letters\__init__.py", line 21, in <module>
    from letters import routes
  File "C:\Users\USER\Documents\yves-letters-2\letters\routes.py", line 5, in <module>
    from letters.forms import Login, Letter, Register, Confirmation, Edit, Filter
  File "C:\Users\USER\Documents\yves-letters-2\letters\forms.py", line 40, in <module>
    class Filter(FlaskForm):
  File "C:\Users\USER\Documents\yves-letters-2\letters\forms.py", line 63, in Filter
    years = SelectField('Year', choices=get_years())
  File "C:\Users\USER\Documents\yves-letters-2\letters\forms.py", line 43, in get_years
    for data in Data.query.all():
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\orm\query.py", line 2759, in all
    return self._iter().all()
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\orm\query.py", line 2897, in _iter
    execution_options={"_sa_orm_load_options": self.load_options},
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\orm\session.py", line 1692, in execute
    result = conn._execute_20(statement, params or {}, execution_options)
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\engine\base.py", line 1614, in _execute_20
    return meth(self, args_10style, kwargs_10style, execution_options)
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\sql\elements.py", line 326, in _execute_on_connection
    self, multiparams, params, execution_options
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\engine\base.py", line 1491, in _execute_clauseelement
    cache_hit=cache_hit,
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\engine\base.py", line 1846, in _execute_context
    e, statement, parameters, cursor, context
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\engine\base.py", line 2027, in _handle_dbapi_exception
    sqlalchemy_exception, with_traceback=exc_info[2], from_=e
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\util\compat.py", line 207, in raise_
    raise exception
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\engine\base.py", line 1803, in _execute_context
    cursor, statement, parameters, context
  File "C:\Users\USER\anaconda3\envs\flask_env\lib\site-packages\sqlalchemy\engine\default.py", line 732, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: data.views
[SQL: SELECT data.id AS data_id, data.title AS data_title, data.content AS data_content, data.author AS data_author, data.status AS data_status, data.date_added AS data_date_added, data.views AS data_views
FROM data]
(Background on this error at: https://sqlalche.me/e/14/e3q8)

在错误消息的末尾,它说“没有这样的列:data.views”,这是真的,因为它是我要迁移的列。 但是为什么会这样呢?

我想您在这里使用的是 SQLite 数据库。 该数据库在更改数据库模式方面非常有限。 升级或降级表失败的情况并不少见。

由于这已经发生,您可以删除导致此问题的迁移。 然后按照以下步骤生成效果更好的迁移。

不幸的是,没有更简单的方法可以解决这个问题。 唯一可用的方法是生成具有新表结构的全新表。 在新迁移期间,您可以初始化批处理模式。

migrate = Migrate(app, db, render_as_batch=True)

然后再次重新生成迁移。

$ flask db migrate -m '<your table>'
$ flask db upgrade

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM