Flask SQLAlchemy db.create_all() not creating database

flask, flask-sqlalchemy, python, sqlalchemy

Solution

The setting should be `SQLALCHEMY_DATABASE_URI`, not `URL`. You can see that the db doesn't have the right uri when you ran this line:

>>> db
<SQLAlchemy engine='sqlite://'>

It shows that Flask-SQLAlchemy defaulted to an in-memory sqlite database. Change the setting and it will work.

As of Flask-SQLAlchemy 3, it will raise an error instead of using a default.

RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set

Problem

I can't seem to figure out why my call to db.create_all() is not working. I have an app package with following init: ``` from flask import Flask from config import config from flask.ext.sqlalchemy import SQLAlchemy # create the database object db = SQLAlchemy() # this function is the application factory def create_app(environment): app = Flask(__name__) app.config.from_object(config[environment]) db.init_app(app) from bp_root import bp_root from bp_aws import bp_aws app.register_blueprint(bp_root, url_prefix='/') app.register_blueprint(bp_aws, url_prefix='/aws') return app ``` Then I have models.py inside the app package: ``` from datetime import datetime from . import db class MyTestClass(db.Model): __tablename__ = 'mytesttable' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(64), nullable=False, unique=True, index=True) username = db.Column(db.String(64), nullable=False, unique=True, index=True) is_admin = db.Column(db.Boolean) password_hash = db.Column(db.String(128)) location = db.Column(db.String(64)) member_since = db.Column(db.DateTime, default=datetime.utcnow) bio = db.Column(db.Text()) def __init__(self, email, username): self.email = email self.username = username def __repr__(self): return '<User %r>' % self.username ``` app.config contains, among other things, the following: ``` 'SQLALCHEMY_DATABASE_URL': 'sqlite:////Users/xxxxx/projects/yyyyy/data-dev.sqlite' ``` Then if I fire up my interactive shell, you can see objects exist appropriately and call to db.create_all() appears to work, but results in no database creation: ``` $ ./manage.py shell >>> from app import db >>> from app import models >>> app <Flask 'app'> >>> db <SQLAlchemy engine='sqlite://'> >>> models <module 'app.models' from '/Users/xxxxx/projects/yyyyy/app/models.py'> >>> dir(models) ['MyTestClass', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'datetime', 'db'] >>> db.create_all() >>> ``` Any thoughts on why the database isn't getting created?

Original source