Форум сайта python.su
PanovSergey
В порядке расширения знаний о сессии.
Вы ведь в курсе, что можно, например, запросить из базы все объекты, а потом отключиться от нее и работать полностью автономно? Все хранится внутри Session.
Или в одной сессии работать с разными базами. Причем, даже можно отдельным пользователям или модулям одного приложения назначить не только разные наборы таблиц, но и разные базы.
Офлайн
для engine - проверил соединяется и работает. А вот как SQLAlchemy() объекту подставить нужную сессию?
Делаю
db.session.remove()
db.session = scoped_session(sessionmaker(bind=engine))
AttributeError: 'NoneType' object has no attribute 'query' File "C:\Python27\lib\site-packages\flask_admin\contrib\sqla\view.py", line 606, in get_query return self.session.query(self.model)
connection = engine.connect() result = connection.execute("select count(*) from base.objecttype") for row in result: print row
Отредактировано ale (Фев. 19, 2014 23:08:44)
Офлайн
Блин, вот код
config.py
from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker, create_session engine = None db_session = scoped_session(lambda: create_session(bind=engine)) from flask.ext.sqlalchemy import SQLAlchemy db = SQLAlchemy() def init_engine(**kwargs): global engine global db_session global db SQLALCHEMY_DATABASE_URI = "postgresql://postgres:passs@%s/master" % session['db'] print SQLALCHEMY_DATABASE_URI engine = create_engine(SQLALCHEMY_DATABASE_URI, convert_unicode=True, echo=True, **kwargs) db.session.remove() db.session = db_session #scoped_session(sessionmaker(bind=engine)) session['db_state'] = True connection = engine.connect() result = connection.execute("select count(*) from base.objecttype") for row in result: print row
@app.route('/connect') def connect(): session['db'] = request.args.get('host', '127.0.0.1') session['db_state'] = False init_engine() return redirect('/admin') if __name__ == '__main__': admin = Admin(app, index_view=Connect_View(name='БД')) from flask.ext.admin.contrib.sqla import ModelView from ot_model import ObjectTypeModel admin.add_view(ModelView(ObjectTypeModel, db_session))
from config import db class ObjectTypeModel(db.Model): __tablename__ = "base.objecttype" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String, unique=True) comment = db.Column(db.String)
ProgrammingError: (ProgrammingError) ОШИБКА: отношение "base.objecttype" не существует LINE 2: FROM "base.objecttype" ^ 'SELECT count(%(param_1)s) AS count_1 \nFROM "base.objecttype"' {'param_1': '*'}
Отредактировано ale (Фев. 19, 2014 23:20:10)
Офлайн
Ух, какой код.
Тяжело его читать.
3 варианта:
1. С этой страницы возьмите пример с contextmanager (с учетом использования flask-alchemy) и добавьте в него инициализацию сессии с текущим connection.
2. На той же странице есть раздел Custom Vertical Partitioning.
Там показан прием с использованием get_bind для подстановки соединения при работе объектов сессии.
Механизм get_bind, если нужны подробности, тоже описан в документации.
3. Можно еще в вашем текущем коде покопаться в свойствах объектах с помощью
http://docs.sqlalchemy.org/en/latest/core/inspection.html#sqlalchemy.inspection.inspect
Порядок вариантов - произвольный.
Возьмите тот вариант, смысл которого поймете или который вам больше понравится.
Офлайн
Сразу скажу, что реализовал что хотел, но не так.
1. Для работы со схемами постргеса необходимо добавить в модель __table_args__ = {'schema': ‘base’}
2. Для работы с flask-alchemy с разными БД я меняю
app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://postgres:пароль@%s/master" % session['db']
Отредактировано ale (Фев. 21, 2014 08:57:17)
Офлайн
alePEP8 вам поможет.
Подскажите, а что не так с кодом?
Офлайн
Вы про это, да наоборот убирал все пробелы, чтобы компактнее сделать код. Да и сам код - тестовый.
Офлайн