Flask,如何在REST应用程序中正确使用SQL alchemy会话?

时间:2017-11-18 13:57:41

标签: python session orm sqlalchemy

提前感谢您的耐心等待。在使用sql-alchemy ORM为许多并发用户构建REST api时,我是一个试图理解正确方法的烧瓶初学者。

信息:我有一个python项目,其中包含许多使用SQL alchemy声明基础编写的实体,例如:

Base = declarative_base(cls=Base)
class Training(Entity, Base):
      id = Column(BigInteger, Sequence('training_id_seq', start=1, increment=1))
      meet           = Column(Integer,  primary_key=True, default=Constants.DefaultInteger)
      trdate         = Column(Date,      primary_key=True)
      hrno           = Column(String,    primary_key=True)
      sptime         = Column(DateTime,  primary_key=True)
      part      = Column(String,    nullable=True)
      partno    = Column(String,    nullable=True)

现在我还想在使用flask的Rest API中使用这些实体。

app = Flask('rest-api', template_folder='../templates', static_folder='../static')
CORS(app)

@app.errorhandler(InvalidUsage)
def handle_invalid_usage(error):
     response = jsonify(error.to_dict())
     response.status_code = error.status_code
     return response


if __name__ == "__main__":
app.config['SQLALCHEMY_DATABASE_URI'] = ServerConstants.FUNDAMENTAL_DB
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.register_blueprint(training_api)
app.run(host=ServerConstants.host, port=ServerConstants.port, debug=ServerConstants.debug,
        ssl_context=('cert.pem', 'key.pem'))

使用蓝图:

training_api = Blueprint('training_api', __name__)

@training_api.route("/training/get", methods=['GET'])
     def get_training():
     **session = Connector.Session()**

     query = session.query(Training)
     query = order_by_latest(query, Training)
     query = add_pagination(request, query)
     trainings = query.all()

     **session.close()**

     return respond_with_json({'trainings': [t.toDict() for t in trainings]})

Connector.Session()保存在sessionmaker中,为每个请求打开一个新会话:

from sqlalchemy.orm import sessionmaker
from tools import ServerConstants

Session = sessionmaker(bind=ServerConstants.ENGINE)

根据您的经验,您可能会看到许多我做错的事情。

我的问题是:

  1. 在我正在做的事情中打开和关闭其余方法中的会话是个好主意吗?

  2. 是否可以为许多并发用户设置这样的设置?

  3. 为什么有些文档建议使用以下构造?

    db = SQLAlchemy(app)
    db.session.query(Training)
    ...
    

    3.1在这种情况下,我不确定何时何地关闭会话?

  4. 在某些特定的休息方法中,我需要使用psycopg连接,并使用以下方法访问它:

      session.connection()
    

    4.1同样,对于每个请求api的客户,我打开会话以及该会话再次打开连接的含义是什么?

  5. 是否有一种优雅的方法来解决sqlalchemy在许多并发用户的休息应用程序中查询?我已经看过flask-sqlalchemy,但这要求我使用他们的风格重新编写我的所有权利,并可能重组整个应用程序,否则我错了?

  6. 感谢您的所有建议和帮助。

0 个答案:

没有答案