Flask-SQLAlchemy db.create_all() got an unexpected keyword argument 'app'

Question:

I’m following a tutorial for creating a Flask app with Flask-SQLAlchemy. However, it has started raising an error when creating the database. How do I create the database?

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///project.db"
    db.init_app(app)

    from . import models

    create_database(app)
    return app

def create_database(app):
    if not path.exists("website/project.db"):
        db.create_all(app=app)
        print("created database")

The line db.create_all(app=app) gives me this error:

SQLAlchemy.create_all() got an unexpected keyword argument 'app'
Asked By: Tatia –

||

Answers:

Flask-SQLAlchemy 3 no longer accepts an app argument to methods like create_all. Instead, it always requires an active Flask application context.

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///project.db"
    db.init_app(app)

    from . import models

    with app.app_context():
        db.create_all()

    return app

There is no need for that create_database function. SQLAlchemy will already not overwrite an existing file, and the only time the database wouldn’t be created is if it raised an error.

Answered By: davidism

I’m running into the same issue and could use some help. I have the exact code above, but when I run my main.py, there is no database.db being created.

Here is my main.py:

from website import create_app
app = create_app()
if __name__ == '__main__':
    app.run(debug=True)

Here is my __init__.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from os import path

db = SQLAlchemy()
DB_NAME = 'database.db'


def create_app():
    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'skey'
    app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}'
    db.init_app(app)

    from .views import views
    from .auth import auth

    app.register_blueprint(views, url_prefix='/')
    app.register_blueprint(auth, url_prefix='/')

    from .models import User, Note

    with app.app_context():
        db.create_all()

    return app
Answered By: Stephen Williams
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.