Một cơ sở dữ liệu
Động cơ là thứ cho phép bạn sử dụng kết nối tổng hợp. Theo mặc định, nó sẽ duy trì các kết nối qua các yêu cầu. Cách sử dụng cơ bản (không có những thứ cầu kỳ như scoped_session
hoặc sessionmaker
) là như thế này:
engine = create_engine(...)
@app.route(...)
def foo():
session = Session(bind=engine)
try:
session.query(...)
session.commit()
finally:
session.close()
return ""
Ngoài ra, bạn có thể thêm scoped_session
và sessionmaker
:
engine = create_engine(...)
Session = sessionmaker(bind=engine)
session = scoped_session(Session, scopefunc=...)
@app.route(...)
def foo():
try:
session.query(...)
session.commit()
finally:
session.close()
return ""
flask-sqlalchemy
làm cho cuộc sống của bạn dễ dàng hơn bằng cách cung cấp tất cả những điều này:
db = SQLAlchemy(app)
@app.route(...)
def foo():
db.session.query(...)
db.session.commit()
return ""
Nhiều cơ sở dữ liệu
Bạn có thể dễ dàng mở rộng khái niệm này cho nhiều cơ sở dữ liệu:
engine1 = create_engine(...)
engine2 = create_engine(...)
@app.route(...)
def foo():
session = Session(bind=choose_engine_for_user())
try:
session.query(...)
session.commit()
finally:
session.close()
return ""
Khi bạn thêm scoped_session
và sessionmaker
:
engine1 = create_engine(...)
engine2 = create_engine(...)
Session1 = sessionmaker(bind=engine1)
Session2 = sessionmaker(bind=engine2)
session1 = scoped_session(Session1, scopefunc=...)
session2 = scoped_session(Session2, scopefunc=...)
@app.route(...)
def foo():
session = choose_session_for_user()
try:
session.query(...)
session.commit()
finally:
session.close()
return ""
Điều này hơi khó chịu khi bạn có nhiều cơ sở dữ liệu, trong trường hợp đó, bạn có thể nên viết một lớp đăng ký để theo dõi tất cả các công cụ và phiên:
class SessionRegistry(object):
_registry = {}
def get(self, url, **kwargs):
if url not in self._registry:
engine = create_engine(url, **kwargs)
Session = session_maker(bind=engine)
session = scoped_session(Session, scopefunc=...)
self._registry[url] = session
return self._registry[url]
registry = SessionRegistry()
@app.route(...)
def foo():
session = registry.get(...)
try:
session.query(...)
session.commit()
finally:
session.close()
return ""
Bạn sẽ cần thêm một số loại LRU bên trên nó để không có việc tạo ra các động cơ không bị ràng buộc.
flask-sqlalchemy
có hỗ trợ cho một dạng giới hạn của nhiều cơ sở dữ liệu trong đó mỗi mô hình của bạn kết nối với một cơ sở dữ liệu khác nhau. Nếu điều này áp dụng cho bạn, tài liệu có tại tại đây
.