user1965813
user1965813

Reputation: 671

Flask's SQLAlchemy().drop_all not working?

I am writing a script that during development should delete the database and populate it with some dummy values. Unfortunately, the drop_all() part of it does not work:

from flask_sqlalchemy import SQLAlchemy

from my_app import create_app
from my_app.models import Block

db = SQLAlchemy()


def main():
    app = create_app()
    db.init_app(app)

    with app.app_context():
        db.session.commit()
        db.drop_all()  # <- I would expect this to drop everything, but it does not
        db.session.commit()

        db.create_all()  # <- This works even if the database is empty

        b1 = Block(name="foo")
        db.session.add(b1)  # <- Every time I run the script, another copy is added
        db.session.commit()


        blocks = Block.query.all()
        for b in blocks:
            print(b)  # <- this should contain exactly one record every time, but keeps getting longer

And my_app.models.py contains:

from . import db

class Block(db.Model):
    __tablename__ = "block"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30))

The drop all does apparently not drop the right tables. Examples I find on SO and other sources tend to feature class definitions in the same file, based on db.Model within the same file (such as here), which I cannot do. Do I need to somehow bind the imported classes to db? If so, how?

Upvotes: 0

Views: 1966

Answers (1)

user1965813
user1965813

Reputation: 671

After some more searching I found the answer: instead of db = SQLAlchemy() in the script, I had to import it like in the models part: from my_app import db. Any explanation of this would be highly appreciated.

Upvotes: 1

Related Questions