Những gì chúng tôi cuối cùng đã làm là sử dụng cơ chế sự kiện của sqlalchemy để bắt các truy vấn trước khi chúng được thực thi và thêm tiền tố để thay đổi lược đồ:
def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
schema_name = <Logic to resolve schema name>
statement = "SET search_path TO '%s'; %s" % (schema_name, statement)
return statement, parameters
......
(later in the code)
listen(Engine, 'before_cursor_execute', before_cursor_execute, retval=True)
Bằng cách này, chúng tôi có thể chạy di chuyển của alembic vài lần, đảm bảo schema_name được giải quyết chính xác mỗi lần và mọi thứ hoạt động trơn tru