Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a database in flask sqlalchemy

I'm building a Flask app with Flask-SQLAlchemy and I'm trying to write a script that will create a Sqlite3 database without running the main application. In order to avoid circular references, I've initialized the main Flask app object and the SQLAlchemy database object in separate modules. I then import and combine them in a third file when running the app. This works fine when I'm running the app, as the database is built and operates properly when create rows and query them. However, when I try to import them in another module, I get the following error:

RuntimeError: application not registered on db instance and no applicationbound to current context

My code looks like the following:

root/create_database.py

from application.database import db
from application.server import app

db.init_app(app)

db.create_all()

root/run.sh

export FLASK_APP=application/server.py
flask run

root/application/init.py

from database import db
from server import app

db.init_app(app)    

from routes import apply_routes   
apply_routes(app)

root/application/database.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

root/application/server.py

from flask import Flask
import os
app = Flask(__name__)

path = os.path.dirname( os.path.realpath(__file__) )
database_path = os.path.join(path, '../mydb.sqlite')

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + database_path

root/application/models/init.py

from user import User

root/application/models/user.py

from application.database import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    password = db.Column(db.String(120))

    def __init__(self, username, password):
        self.username = username
        self.password = password

In my create_database.py script I'm trying to make sure that the SQLAlchemy db instance is configured with the config details from the app object, but it doesn't seem to be connecting for some reason. Am I missing something important here?

like image 290
Copernicus Avatar asked Feb 05 '23 13:02

Copernicus


1 Answers

You either have to create a request or you have to create the models with sqlalchemy directly. We do something similar at work and chose the former.

Flask lets you create a test request to initialize an app. Try something like

from application.database import db
from application.server import app

with app.test_request_context():
     db.init_app(app)

     db.create_all()
like image 178
Cfreak Avatar answered Feb 09 '23 01:02

Cfreak