postgresql – SQLAlchemy支持Postgres Schemas
我们使用SQLAlchemy和postgres托管一个多租户应用程序。我正在考虑从每个租户的单独数据库转移到具有多个架构的单个数据库。 SQLAlchemy是否支持本机?我基本上只是希望每一个出来的查询以预定的模式为前缀
select * from client1.users 而不是只是 select * from users 请注意,我想在特定请求/一组请求中切换所有表的模式,而不仅仅是单个表。 我想象这可以通过自定义查询类来实现,但是我无法想象,这一点还没有完成。
那么有几种方法可以解决这个问题,这取决于你的应用程序的结构。这是最基本的方法:
meta = MetaData(schema="client1") 如果你的应用程序运行的方式是整个应用程序中的一个“客户端”,你就完成了。 但是这可能是错误的,MetaData的每个表都是在该模式上。如果您想要一个应用程序同时支持多个客户端(通常是“多租户”的意思),那么这将是笨重的,因为您需要创建一个MetaData的副本并且将每个客户端的所有映射都复制出去。如果你真的想要这个方法,那么你可以使用一个特定的映射类来访问每个客户端,如果你真的想要这样做, client1_foo = Client1Foo() 在这种情况下,您将使用http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName中的“实体名称”配方与sometable.tometadata()一起使用(参见http://docs.sqlalchemy.org/en/latest/core/schema.html?highlight=metadata#sqlalchemy.schema.Table.tometadata)。 所以让我们说,它真正有效的方式是应用程序中的多个客户端,但每个线程只能一个。实际上,在Postgresql中最简单的方法是在开始使用连接时设置搜索路径: # start request # new session sess = Session() # set the search path sess.execute("SET search_path TO client1") # do stuff with session # close it. if you're using connection pooling,the # search path is still set up there,so you might want to # revert it first sess.close() 最终的方法是使用@compiles扩展来覆盖编译器,以将“schema”名称粘贴在语句内。这是可行的,但是会很棘手,因为没有一个一致的钩子,无处不在“表”被生成。你最好的选择是设置每个请求的搜索路径。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 【译】哥们儿,我的方法哪儿去了?
- actionscript-3 – 在新窗口中打开Actionscript 3
- Error parsing XML: unbound prefix on XXX解决办法
- objective-c – 如果不在Xcode 6中导入UIKit.h,则无法访问U
- oracle基本结构
- 我应该学习Ruby 1.8还是1.9?
- Node.js配合node-http-proxy解决本地开发ajax跨域问题
- ruby-on-rails – 用于编写Redmine插件的良好文档
- 正则表达式使用格式为YYYY-MM-DD在PHP中验证日期
- ruby-on-rails – aws-s3 gem除非定义? @@ {:instance_wr