2015-03-10 16 views
0

Вот что я сделал:Колба-SQLAlchemy использованием глобального экземпляра DB

from flask import Flask 
    from sqlalchemy import create_engine 
    from sqlalchemy.orm import sessionmaker 

    dbhost = 'localhost' 
    dbuser = 'user' 
    dbpass = 'password' 
    dbname = 'db' 
    DBUri = 'mysql://%s:%[email protected]%s/%s?charset=utf8'%(dbuser,dbpass,dbhost,dbname) 

    app = Flask(__name__) 
    app.config['SQLALCHEMY_DATABASE_URI'] = (DBUri) 
    app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT' 


    # an Engine, which the Session will use for connection 
    # resources 
    engine = create_engine(DBUri) 

    # create a configured "Session" class 
    Session = sessionmaker(bind=engine) 

    # create a Session 
    DBsession = Session() 

и

@sched.cron_schedule(second='*/5') 
def some_decorated_task(): 
    date_now = datetime.datetime.now().date() 
    for item in DBsession.query(user_groups_n_hosts).filter(user_groups_n_hosts.end_time < str(date_now)): 
     print item.id, item.server_users.native_linux_user 

есть таблица user_groups_n_hosts Приведенный выше код является функцией, которая выполняется каждые 30 секунд.

Моя проблема заключается в том, что только я начинаю флягу приложение в то время, если user_groups_n_hosts имеет 10 записей, то приведенный выше код будет держать не печать 10 записей независимо от того, какого бы числа записей вставляются в таблице user_groups_n_hosts снаружи , Другими словами, я считаю, что у моей функции есть некоторый экземпляр таблицы, которая инициализируется только в начале инициализации приложения. Я знаю, что делаю что-то глупое. пожалуйста, отметьте это.

вместо DBsession.query(user_groups_n_hosts).filter(user_groups_n_hosts.end_time < str(date_now)): Я попытался user_groups_n_hosts.query.filter(user_groups_n_hosts.end_time < str(date_now)): Но результат тот же.

ответ

1

Ваш фильтр user_groups_n_hosts.end_time < str (date_now) сравнивает дату со строкой.

Кроме того, вы должны рассматривать сеанс как предмет запроса, а не постоянный объект в своем приложении.

Имея это в виде, попробуйте изменить

@sched.cron_schedule(second='*/5') 
def some_decorated_task(): 
    date_now = datetime.datetime.now().date() 
    for item in DBsession.query(user_groups_n_hosts).filter(user_groups_n_hosts.end_time < str(date_now)): 
     print item.id, item.server_users.native_linux_user 

в

@sched.cron_schedule(second='*/5') 
def some_decorated_task(): 
    date_now = datetime.datetime.now().date() 
    sess = Session() 
    for item in sess.query(user_groups_n_hosts).filter(user_groups_n_hosts.end_time < str(date_now)): 
     print item.id, item.server_users.native_linux_user 
    sess.close() 
1

Вы должны установить свежую транзакцию каждый раз. И вы можете создать совершенно новый объект сеанса каждый запуск, повторное использование сеанса, но убедитесь, что вы commit(), rollback() или close() это после вашего запроса.

Эффект вызван некоторой политикой MySQL по умолчанию.

Если вы используете InnoDB в качестве хранилища по умолчанию для MySQL, то он использует REPEATABLE READ в качестве уровня изоляции. Это значение по умолчанию, поскольку в большинстве случаев имеет смысл избегать Non-repeatable Reads внутри транзакций. Итак, если вы не закончите свою транзакцию, вы получите одинаковые результаты из базы данных каждый раз.

С в SQLAlchemy docs:

сессии, когда она используется, чтобы говорить с базой данных, начинает транзакцию базы данных, как только он начинает общаться. Предполагая, что флаг autocommit остается по умолчанию по умолчанию False, эта транзакция остается в силе до тех пор, пока сеанс не будет отменен, не будет завершен или закрыт. Сессия начнет новую транзакцию, если она будет использоваться снова, после окончания предыдущей транзакции; из этого следует, что Сессия способна иметь продолжительность жизни во многих транзакциях, хотя и по одному за раз. Мы рассматриваем эти два понятия как объем транзакции и Сфера действия.

Другой вариант, который не рекомендуется, создает сессию autocommit=True, которая будет автоматически совершать сделки после каждого и каждого оператора запроса.

Смежные вопросы