![](/img/trans.png)
[英]flask db migrate not working sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file (Background on this error at:
[英]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.