flask migrate command throwing sqlalchemy.exc.NoReferencedTableError

61 views Asked by At

So as a learner, I was experimenting database relationship with flask_sqlalchemy and flask_migrate.I tried adding two model into the database and then by migration afterwards, ill add the other column. But this this returned me some errors.

I wrote the code down below:

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)

At first I didnt put PetFood class into the code. I tried creating database and did CRUD with that.It worked well. But after including this part:

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

I am getting this error:

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'

Please help me to understand the problem here. Thank you.

1

There are 1 answers

0
ionheart On

I believe you have a typo:

Instead of

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

Try:

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