因此,作为学习者,我正在试验与
flask_sqlalchemy
和 flask_migrate
的数据库关系。我尝试将两个模型添加到数据库中,然后通过迁移,添加另一列。但这给我带来了一些错误。
我把代码写在下面:
from flask import Flask,render_template
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app=Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"]="sqlite:///database.sqlite"
app.config["SQLALCHEMY_TRACK_MODIFICATION"]=False
db=SQLAlchemy(app)
Migrate(app,db)
class Owner(db.Model):
__tablename__ ="pet owners"
user_id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(70),nullable=False)
address=db.Column(db.String(140))
pets=db.relationship("Pet",backref="pet_owner")
def __init__(self,name):
self.name=name
class Pet(db.Model):
__tablename__ ="pets"
pet_id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(70),nullable=False)
owner=db.Column(db.Integer,db.ForeignKey("owner.user_id"))
favourite_food=db.relationship("PetFood",backref="pet_food")
def __init__(self,name,owner):
self.name=name
self.owner=owner
class PetFood(db.Model):
__tablename__ ="pet foods"
product_id=db.Column(db.Integer,primary_key=True)
food_name=db.Column(db.String(100),nullable=False)
brand_name=db.Column(db.String(100),nullable=False)
liked_by=db.Column(db.Integer,db.ForeignKey("pet.pet_id"))
def __init__(self,name,brand):
self.food_name=name
self.brand_name=brand
@app.route("/")
def index():
return render_template("index.html")
if __name__=="__main__":
app.run(debug=True)
起初我没有将 PetFood 类放入代码中。我尝试创建数据库并对其进行 CRUD。效果很好。但包括这部分之后:
class PetFood(db.Model):
__tablename__ ="pet foods"
product_id=db.Column(db.Integer,primary_key=True)
food_name=db.Column(db.String(100),nullable=False)
brand_name=db.Column(db.String(100),nullable=False)
liked_by=db.Column(db.Integer,db.ForeignKey("pet.pet_id"))
def __init__(self,name,brand):
self.food_name=name
self.brand_name=brand
我收到此错误:
E:\Flask\new\flask4>flask db migrate -m "favourite food table"
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Scripts\flask.exe\__main__.py", line 7, in <module>
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\cli.py", line 1063, in main
cli.main()
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\click\core.py", line 1055, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\click\core.py", line 1657, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\click\core.py", line 1657, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\click\core.py", line 1404, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\click\core.py", line 760, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\click\decorators.py", line 26, in new_func
return f(get_current_context(), *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask\cli.py", line 357, in decorator
return __ctx.invoke(f, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\click\core.py", line 760, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask_migrate\cli.py", line 105, in migrate
_migrate(directory, message, sql, head, splice, branch_label, version_path,
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask_migrate\__init__.py", line 111, in wrapped
f(*args, **kwargs)
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\flask_migrate\__init__.py", line 170, in migrate
command.revision(config, message, autogenerate=True, sql=sql,
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\command.py", line 236, in revision
script_directory.run_env()
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\script\base.py", line 578, in run_env
util.load_python_file(self.dir, "env.py")
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\util\pyfiles.py", line 93, in load_python_file
module = load_module_py(module_id, path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\util\pyfiles.py", line 109, in load_module_py
spec.loader.exec_module(module) # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen importlib._bootstrap_external>", line 940, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "E:\Flask\new\flask4\migrations\env.py", line 110, in <module>
run_migrations_online()
File "E:\Flask\new\flask4\migrations\env.py", line 104, in run_migrations_online
context.run_migrations()
File "<string>", line 8, in run_migrations
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\runtime\environment.py", line 927, in run_migrations
self.get_context().run_migrations(**kw)
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\runtime\migration.py", line 614, in run_migrations
for step in self._migrations_fn(heads, self):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\command.py", line 212, in retrieve_migrations
revision_context.run_autogenerate(rev, context)
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\autogenerate\api.py", line 560, in run_autogenerate
self._run_environment(rev, migration_context, True)
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\autogenerate\api.py", line 607, in _run_environment
compare._populate_migration_script(
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\autogenerate\compare.py", line 59, in _populate_migration_script
_produce_net_changes(autogen_context, upgrade_ops)
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\autogenerate\compare.py", line 92, in _produce_net_changes
comparators.dispatch("schema", autogen_context.dialect.name)(
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\util\langhelpers.py", line 268, in go
fn(*arg, **kw)
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\autogenerate\compare.py", line 128, in _autogen_for_tables
[(table.schema, table.name) for table in autogen_context.sorted_tables]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 1141, in __get__
obj.__dict__[self.__name__] = result = self.fget(obj)
^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\alembic\autogenerate\api.py", line 477, in sorted_tables
result.extend(m.sorted_tables)
^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\sqlalchemy\sql\schema.py", line 5585, in sorted_tables
return ddl.sort_tables(
^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\sqlalchemy\sql\ddl.py", line 1254, in sort_tables
for (t, fkcs) in sort_tables_and_constraints(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\sqlalchemy\sql\ddl.py", line 1330, in sort_tables_and_constraints
dependent_on = fkc.referred_table
^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\sqlalchemy\sql\schema.py", line 4740, in referred_table
return self.elements[0].column.table
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 1141, in __get__
obj.__dict__[self.__name__] = result = self.fget(obj)
^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\sqlalchemy\sql\schema.py", line 3148, in column
return self._resolve_column()
^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\isfar\AppData\Local\Programs\Python\Python311\Lib\site-packages\sqlalchemy\sql\schema.py", line 3171, in _resolve_column
raise exc.NoReferencedTableError(
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'pet foods.liked_by' could not find table 'pet' with which to generate a foreign key to target column 'pet_id'
请帮助我理解这里的问题。谢谢你。
我相信你有错字:
而不是
liked_by=db.Column(db.Integer,db.ForeignKey("pet.pet_id"))
尝试:
liked_by=db.Column(db.Integer,db.ForeignKey("pets.pet_id"))