使用 sqlalchemy 时刷新外部数据库更改,新 http 请求的烧瓶

时间:2021-06-07 13:07:08

标签: python rest flask sqlalchemy

我正在开发一个 API,它使用 Flask、Sqlalchemy 和一个由外部应用程序使用的 MySQL 数据库返回 JSON。问题是,在向我正在构建的 API 提出新的数据请求时,使用以下代码返回的数据是旧的(未显示在 api 启动后从外部客户端添加的新条目):

area/routes.py:

from app.db import Base, session
from app.db.models import Room, Entry
@areas_bp.route('/area/<int:area_id>')
def area(area_id):
    '''
    Return all rooms in area and their entries
    :param area_id: id of an area
    :return:
    '''

    rooms = session.query(Room).filter_by(lsb_area_id=area_id)
    entries = session.query(Entry)

    session.rollback()

    ret_list = list()

    for room in rooms:
        entries_filtered = entries.filter_by(room_id=room.id)

        # ret_str += f"Room {room.id} '{room.room_name}' <br />"
        room_dict = room.to_dict()
        room_dict['entries'] = [simplify_area_dict(entry.to_dict()) for entry in entries_filtered]

        ret_list.append(room_dict)

    return jsonify(ret_list)

如您所见,我添加了 session.rollback(),它似乎更新了会话中的数据,但我不确定这是否是实现此目的的有效方法。 我还阅读了有关 scoped_session 的信息,但我不确定它是否也能以任何方式帮助我。 你能指出我正确的方向吗?

谢谢!

数据库设置(app.db):

from configparser import ConfigParser
from os.path import abspath

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session


def read_db_config(filename='app/db/config.ini', section='mysql'):
    """ Read database configuration file and return a dictionary object
    :param filename: name of the configuration file
    :param section: section of database configuration
    :return: a dictionary of database parameters
    """
    # create parser and read ini configuration file
    parser = ConfigParser()
    parser.read(filename)

    # get section, default to mysql
    db = {}
    if parser.has_section(section):
        items = parser.items(section)
        for item in items:
            db[item[0]] = item[1]
    else:
        raise Exception('[MySQL] {0} not found in the {1} file. Abs filename: {2}'.format(section, filename, abspath(filename)))

    return db


db_config = read_db_config()

# SqlAlchemy Database Configuration With Mysql
db_uri = f"mysql+pymysql://{ db_config['user'] }:{ db_config['password'] }@" \
                                        f"{ db_config['host'] }:{ db_config['port'] }/" \
                                        f"{ db_config['database'] }"
engine = create_engine(db_uri)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
session = scoped_session(SessionLocal)

Base = declarative_base()
metadata = Base.metadata

0 个答案:

没有答案