flask 迁移命令抛出 sqlalchemy.exc.NoReferencedTableError

问题描述 投票:0回答:1

因此,作为学习者,我正在试验与

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'

请帮助我理解这里的问题。谢谢你。

flask flask-sqlalchemy flask-migrate
1个回答
0
投票

我相信你有错字:

而不是

liked_by=db.Column(db.Integer,db.ForeignKey("pet.pet_id"))

尝试:

liked_by=db.Column(db.Integer,db.ForeignKey("pets.pet_id"))
© www.soinside.com 2019 - 2024. All rights reserved.