1

I have an existing model that I can't change, written in Flask-SQLAlchemy. I'm writing another app that uses the same model, but without the need for Flask, therefore I'm working with the regular SQLAlchemy module. Unfortunately, I'm getting a lot of: 'AttributeError: module 'DB' has no attribute 'Model' for all kind of attributes - such as Column, Integer, etc Is there a way to use Flask-SQLAlchemy with a regular SQLAlchemy app?

There is an example of one of my Model Class:

class Table_name(Model):
    __tablename__ = 'table_name'
    id = db.Column(db.INTEGER, primary_key=True)
    field1 = db.Column(db.INTEGER, db.ForeignKey('table1.id'), nullable=False)
    field2 = db.Column(db.TEXT, nullable=False)
    field3 = db.Column(db.INTEGER, db.ForeignKey('table2.id'), nullable=False)
    time = db.Column(db.TIMESTAMP, nullable=False)

Unfortunately I can't change them

2
  • Flask-SQLAlchemy thin wrapper binding for sqlalchemy in a flask. You could use sqlalchemy without flask-sqlalchemy. Without looking code or your effort it is hard to say. Commented Jan 30, 2020 at 9:17
  • I added example of one of my model class, Unfortunately the model is legacy, therefore, I can't change it Commented Jan 30, 2020 at 9:50

2 Answers 2

1

I've had the same dilemma. If it's a small or one-off, you can hack in a Flask app object without really using it, like so:

from flask_sqlalchemy import SQLAlchemy

throw_away_app = Flask(__name__)
db = SQLAlchemy(throw_away_app)
with self.throw_away_app.app_context():
    (perform your db operation)

That works relatively well for simple things like scripts. But if you're sharing a model across multiple projects and you simply cannot alter the existing Flask project, it's unfortunately probably not a good solution.

If that's the case, and you simply cannot alter the existing codebase at all, it probably makes sense to create a new model class and connect to the existing database using vanilla SQLAlchemy.

BTW, for any future programmers wondering how to get some of the benefits of Flask-SQLAlchemy without Flask, consider: sqlalchemy-mixins.

Sign up to request clarification or add additional context in comments.

Comments

0
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String, Text, TIMESTAMP, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


Base = declarative_base()

#  connect in memory sqlite database or you can connect your own database
engine = create_engine('sqlite:///:memory:', echo=True)

# create session and bind engine
Session = sessionmaker(bind=engine)


class Table_name(Base):
    __tablename__ = 'table_name'
    id = Column(Integer, primary_key=True)
    field1 = Column(Integer, ForeignKey('table1.id'), nullable=False)
    field2 = Column(Text, nullable=False)
    field3 = Column(Integer, ForeignKey('table2.id'), nullable=False)
    time = Column(TIMESTAMP, nullable=False)

table = Table_name(field1=1, fi....)
session.add(table)

Now you can use your ORM as usual like flask-sqlalchemy .

Docs: https://docs.sqlalchemy.org/en/13/orm/tutorial.html

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.