On Wednesday, August 22, 2012 2:33:01 PM UTC+1, David McKeone wrote: > > > > On Wednesday, August 22, 2012 2:23:28 PM UTC+1, Simon King wrote: >> >> On Wed, Aug 22, 2012 at 12:51 PM, David McKeone <davidm...@gmail.com> >> wrote: >> > I've been using SQLAlchemy with Flask via the Flask extension >> > Flask-SQLAlchemy. Everything works great so far, but I foresee a >> potential >> > problem once I start to use my database model outside of Flask. In the >> > future I'd like to be able to use my models with non-Flask SQLAlchemy >> (a >> > worker daemon process or with a PySide interface). "Well just use >> standard >> > SQLAlchemy," you may say, " and fore-go the use of the extension". >> That was >> > my first thought, but sadly some useful extensions (notably >> > Flask-DebugToolbar) seem to like using the extension version and it is >> nice >> > to be able to have Flask manage the database sessions in the way that >> it >> > does. I'd like to not throw the baby out with the bath water. >> > >> > I realize that this is somewhat specific to Flask, but is there a way >> that I >> > could do both? Can I create models with standard SQLAlchemy >> declarative and >> > then somehow inject them into Flask-SQLAlchemy's way of doing things? >> > >> > If it helps with the solution, I don't need to use any of the Model >> specific >> > methods that Flask-SQLAlchemy provides (get_or_404, paginate, etc..) >> and I >> > also specify a __tablename__ for all of my models, so I don't rely on >> > Flask-SQLAlchemy generating that for me. >> > >> > I took a look at the source of Flask-SQLAlchemy >> > ( >> https://github.com/mitsuhiko/flask-sqlalchemy/blob/master/flask_sqlalchemy.py) >> >> >> > and from what I can tell it seems that it's using Flask's signalling >> > capabilities by customizing SQLAlchemy's session and mapper, but that >> is >> > where my understanding ends (I'm still new to this whole stack, Python, >> > Flask, SQLAlchemy) and I could use some pointers for how to proceed. >> > >> > >> > To visualize what I'm talking about, here are the two types of models. >> A >> > basic Flask-SQLAlchemy model looks like >> > ( >> http://packages.python.org/Flask-SQLAlchemy/quickstart.html#a-minimal-application): >> >> >> > >> > from flask import Flask >> > from flask.ext.sqlalchemy import SQLAlchemy >> > >> > app = Flask(__name__) >> > app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' >> > >> > db = SQLAlchemy(app) >> > >> > class User(db.Model): >> > id = db.Column(db.Integer, primary_key=True) >> > username = db.Column(db.String(80), unique=True) >> > email = db.Column(db.String(120), unique=True) >> > >> > def __init__(self, username, email): >> > self.username = username >> > >> > self.email = email >> > >> > >> > def __repr__(self): >> > return '<User %r>' % self.username >> > >> > >> > Note the db.Model, db.Integer and db <dot> everything. >> > >> > The plain declarative SQLAlchemy equivalent would be >> > (http://flask.pocoo.org/docs/patterns/sqlalchemy/): >> > >> > >> > from sqlalchemy import Column Integer, String, create_engine >> > from sqlalchemy.orm import scoped_session, sessionmaker >> > from sqlalchemy.ext.declarative import declarative_base >> > >> > engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True) >> > db_session = scoped_session(sessionmaker(autocommit=False, >> autoflush=False, >> > bind=engine)) >> > Base = declarative_base() >> > Base.query = db_session.query_property() >> > >> > >> > class User(Base): >> > __tablename__ = 'users' >> > >> > id = Column(Integer, primary_key=True) >> > name = Column(String(50), unique=True) >> > email = Column(String(120), unique=True) >> > >> > def __init__(self, name=None, email=None): >> > self.name = name >> > self.email = email >> > >> > def __repr__(self): >> > return '<User %r>' % (self.name) >> > >> >> From a very quick read of the Flask-SQLAlchemy docs, I would have >> thought you could just use your flask-based classes in non-Flask-based >> apps without any issue. The quickstart guide that you referenced above >> illustrates a command-line session using them, so there's no reason >> why you couldn't do the same in a worker process. >> >> Have you already tried it and found that it doesn't work? >> >> Simon >> > > > Perhaps I've missed the important bit, but my understanding is that there > are two ways to do it: > > 1) Use SQLAlchemy with manual session control ( > http://flask.pocoo.org/docs/patterns/sqlalchemy/) > 2) Use SQLAlchemy with the Flask-SQLAlchemy extension which does session > control for you, but requires you to use it's own declarative base class, > db.Model ( > http://packages.python.org/Flask-SQLAlchemy/quickstart.html#a-minimal-application > ) > > The problem is that other extensions give you additional features if you > use solution #2, but not if you use solution #1, because solution #1 > implies that you are going to do everything yourself manually. I'm fine > with the way solution #2 handles the sessions and everything else, I just > want to be able to use my own declarative base so that the models are > more-or-less independent of the app that they are being used in. >
I did a re-read of the documentation and I'm guessing this is the part of the documentation you are referring to: http://packages.python.org/Flask-SQLAlchemy/contexts.html That basically says to use: app.test_request_context() before doing what you do, so that it can establish a new context. I suppose that does make sense, I guess i just viewed it as being only for testing and not for application use. I would have thought it might be strange to include Flask in a worker daemon when it isn't actually servicing http requests. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To view this discussion on the web visit https://groups.google.com/d/msg/sqlalchemy/-/5rIH4VNzWB0J. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.