Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Web
  • » Изменение настроек flask-alchemy runtime [RSS Feed]

#1 Фев. 19, 2014 23:00:09

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Изменение настроек flask-alchemy runtime

PanovSergey
В порядке расширения знаний о сессии.
Вы ведь в курсе, что можно, например, запросить из базы все объекты, а потом отключиться от нее и работать полностью автономно? Все хранится внутри Session.
Или в одной сессии работать с разными базами. Причем, даже можно отдельным пользователям или модулям одного приложения назначить не только разные наборы таблиц, но и разные базы.



Офлайн

#2 Фев. 19, 2014 23:03:48

ale
Зарегистрирован: 2014-02-19
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение настроек flask-alchemy runtime

для 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)

Офлайн

#3 Фев. 19, 2014 23:19:46

ale
Зарегистрирован: 2014-02-19
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение настроек flask-alchemy runtime

Блин, вот код

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)

Офлайн

#4 Фев. 21, 2014 01:17:33

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Изменение настроек flask-alchemy runtime

Ух, какой код.
Тяжело его читать.

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

Порядок вариантов - произвольный.
Возьмите тот вариант, смысл которого поймете или который вам больше понравится.



Офлайн

#5 Фев. 21, 2014 08:56:23

ale
Зарегистрирован: 2014-02-19
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение настроек flask-alchemy runtime

Сразу скажу, что реализовал что хотел, но не так.
1. Для работы со схемами постргеса необходимо добавить в модель __table_args__ = {'schema': ‘base’}
2. Для работы с flask-alchemy с разными БД я меняю

app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://postgres:пароль@%s/master" % session['db'] 
PS.
Подскажите, а что не так с кодом? А за подсказки, большое спасибо

Отредактировано ale (Фев. 21, 2014 08:57:17)

Офлайн

#6 Фев. 21, 2014 11:28:23

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Изменение настроек flask-alchemy runtime

ale
Подскажите, а что не так с кодом?
PEP8 вам поможет.
Включите в вашем редакторе проверку кода на соответствие PEP8 и она много интересного покажет ;)



Офлайн

#7 Фев. 21, 2014 11:57:29

ale
Зарегистрирован: 2014-02-19
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение настроек flask-alchemy runtime

Вы про это, да наоборот убирал все пробелы, чтобы компактнее сделать код. Да и сам код - тестовый.

Офлайн

  • Начало
  • » Web
  • » Изменение настроек flask-alchemy runtime[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version