提前感谢您的耐心等待。在使用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)
根据您的经验,您可能会看到许多我做错的事情。
我的问题是:
在我正在做的事情中打开和关闭其余方法中的会话是个好主意吗?
是否可以为许多并发用户设置这样的设置?
为什么有些文档建议使用以下构造?
db = SQLAlchemy(app)
db.session.query(Training)
...
3.1在这种情况下,我不确定何时何地关闭会话?
在某些特定的休息方法中,我需要使用psycopg连接,并使用以下方法访问它:
session.connection()
4.1同样,对于每个请求api的客户,我打开会话以及该会话再次打开连接的含义是什么?
是否有一种优雅的方法来解决sqlalchemy在许多并发用户的休息应用程序中查询?我已经看过flask-sqlalchemy,但这要求我使用他们的风格重新编写我的所有权利,并可能重组整个应用程序,否则我错了?
感谢您的所有建议和帮助。