[英]flask_migrate KeyError: 'migrate'
我目前正在學習 Flask 並且正在研究數據庫關系,但是我正在 cmd 中嘗試以下命令:
set FLASK_APP=app4.py
flask db init
當我運行它時,我得到以下信息:
Traceback (most recent call last):
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\Scripts\flask.exe\__main__.py", line 9, in <module>
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\flask\cli.py", line 966, in main
cli.main(prog_name="python -m flask" if as_module else None)
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\flask\cli.py", line 586, in main
return super(FlaskGroup, self).main(*args, **kwargs)
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\click\core.py", line 717, in main
rv = self.invoke(ctx)
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\click\core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\click\core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\click\core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\click\core.py", line 555, in invoke
return callback(*args, **kwargs)
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\click\decorators.py", line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\flask\cli.py", line 426, in decorator
return __ctx.invoke(f, *args, **kwargs)
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\click\core.py", line 555, in invoke
return callback(*args, **kwargs)
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\flask_migrate\cli.py", line 31, in init
_init(directory, multidb)
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\flask_migrate\__init__.py", line 96, in wrapped
f(*args, **kwargs)
File "c:\users\admin\appdata\local\programs\python\python37-32\lib\site-packages\flask_migrate\__init__.py", line 126, in init
directory = current_app.extensions['migrate'].directory
KeyError: 'migrate'
我真的不確定我做錯了什么,任何幫助將不勝感激。 這是我目前擁有的python腳本:
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir,'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
migrate = Migrate()
migrate.init_app(app, db)
class Puppies(db.Model):
__tablename__ = 'Puppies'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text)
toys = db.relationship('Toy', backref='Puppies', lazy='dynamic') #Connects to the Toy model (the class below) | connects the puppy to many toys | will return list of toys
owner = db.relationship('Owner', backref='Puppies', uselist=False) #uselist=False will ensure it doesn't bring a list of items, it will return 1.
def __init__(self,name):
self.name = name
def __repr__(self):
if self.owner:
return f"Puppy Name: {self.name} | Owner: {self.owner.name}"
else:
return f"Puppy Name: {self.name} | The puppy currently has no owner."
def report_toys(self):
print("Here are my toys:")
for toy in self.toys:
print(toy.item_name)
class Toy(db.Model):
__tablename__ = 'Toys'
id = db.Column(db.Integer, primary_key=True)
item_name = db.Column(db.Text)
puppies_id = db.Column(db.Integer, db.ForeignKey(Puppies.id)) #this will get the id from the Puppies table (the above class)
def __init__(self, item_name, puppies_id):
self.item_name = item_name
self.puppies_id = puppies_id
class Owner(db.Model):
__tablename__ = 'Owners'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text)
puppies_id = db.Column(db.Integer, db.ForeignKey(Puppies.id)) #this will get the id from the Puppies table
def __init__(self, name, puppies_id):
self.name = name
self.puppies_id = puppies_id
錯誤顯然是一個燒瓶數據庫。 希望你已經導入了flask-migrate
和flask-sqlalchemy
,你在__init__.py
注冊flask-migrate
的方式是不正確的。
情況1:
如果您在應用程序中使用應用程序工廠,則需要使用migrate.init_app(app, db)
。 所以你的__init__.py
看起來像這樣:
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app.config.from_object(Config)
db = SQLAlchemy()
migrate = Migrate()
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
db.init_app(app)
migrate.init_app(app, db)
# ...
上面,你的工廠函數是create_app()
。
案例2:
如果您沒有使用工廠函數,如在您的腳本中,則不要使用migrate.init_app(app, db)
。 相反,讓你的__init__.py
足夠簡單:
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
# ...
使用其中任何一個,您都可以運行遷移:
$ flask db init
$ flask db migrate -m '<your table>'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.