ML-DL-Learner
ML-DL-Learner

Reputation: 25

Flask-SQLAlchemy not working after upgrading to 3.0.5

I have following setup:

app.py

from app.__init__ import create_app

app=create_app()
     
if __name__ == "__main__":
    app.run()

init.py

from flask import Flask
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy
from flask_mysqldb import MySQL


db = SQLAlchemy()
mysql = MySQL()
    
def create_app():
    app = Flask(__name__)
    app.config.from_object(__name__+'.ConfigClass')
    app.config['MYSQL_HOST'] = 'hostname'
    app.config['MYSQL_USER'] = 'username'
    app.config['MYSQL_PASSWORD'] = 'userpwd'
    app.config['MYSQL_DB'] = 'testdb'
    
    db.app = app
    db.init_app(app)
    mysql.init_app(app)
    
    login_manager = LoginManager()
    login_manager.session_protection = "strong"
    login_manager.login_view = 'auth.login'
    login_manager.init_app(app)

    # blueprint for auth routes in our app
    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint)

    # blueprint for non-auth parts of app
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    # blueprint for element parts of app
    from .element import element as element_blueprint
    app.register_blueprint(element_blueprint)
    
    from .dbase import dbase as element_blueprint
    app.register_blueprint(element_blueprint)
    
    # blueprint for element parts of app
    from .dbase import User

    @login_manager.user_loader
    def load_user(username):
        return User.query.filter_by(ID=int(username)).first()

    return app

element.py

from flask import Blueprint, current_app
from flask_login import login_required,current_user
from .dbase import LeadQuery
from . import mysql
from . import db

element=Blueprint('element',__name__)
...
...
def add_query(row):
    print(row)
    
    lead = LeadQuery(... vars ...)
                     )
    db.session.add(lead)
    db.session.commit()
    return 'SUCCESS', 'SUCCESS'

This was working fine until I upgraded the Flask-SQLAlchemy to 3.0.5

Now it's giving error in element.py add_query:

RuntimeError: The current Flask app is not registered with this 'SQLAlchemy' instance. Did you forget to call 'init_app', or did you create multiple 'SQLAlchemy' instances?

Tried followings but it didn't worked:

  1. kept 'app' variable in init and used while initiating failed because create_app was giving error in .dbase initialization

  2. in add_query initialize separate db variable it gave error:

RuntimeError: A 'SQLAlchemy' instance has already been registered on this Flask app. Import and use that instance instead.

dbase.py

from flask import Blueprint
dbase = Blueprint('dbase', __name__)
from . import db
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash

# Define the User data-model.
class User(UserMixin,db.Model):
    __tablename__ = 'USERS'
    ID = db.Column(db.Integer, primary_key=True)
    STATUS = db.Column('STATUS', db.Text, nullable=False, server_default='ACTIVE')
    MOBILE = db.Column('MOBILE', db.Integer(), nullable=False, server_default='')
    
    PASSWORD = db.Column(db.String(255), nullable=False, server_default='')
    # User information
    FNAME = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='')
    LNAME = db.Column(db.String(100, collation='NOCASE'), nullable=False, server_default='')

    # Define the relationship to Role via UserRoles
    ROLES = db.relationship('Role', secondary='USER_ROLES')

    def check_password(self, password):
        return check_password_hash(self.PASSWORD, password)
    
    def get_MF(self):
        return str(self.MF)
    
    def get_id(self):
        return str(self.ID)
    
    def get_name(self):
        return str(self.FNAME)
    
    def get_role(self):
        return str(self.ROLES[0].ROLE)

    def __repr__(self):
        return '<User %r>' % self.FNAME

Flask: 2.3.2 SQLAlchemy: 2.0.16 PyMySQL: 1.0.2 Flask-SQLAlchemy: 3.0.5

Would you please suggest what could be the solution?

Upvotes: 0

Views: 1092

Answers (1)

ML-DL-Learner
ML-DL-Learner

Reputation: 25

Used the following packages (downgraded) to resolve the issue:

sqlalchemy==1.4.48

flask-sqlalchemy==2.5.1

Upvotes: 0

Related Questions