具有多租户数据库结构的 ActiveJDBC
ActiveJDBC with multi-tenant DB structure
我有一个多租户数据库架构。有没有办法对多个相同的数据库使用一个活动模型?
一点说明:
我有一个 Foo exdends Model
class 可以与 foo_table
一起使用。 foo_table
在 schemaA, schemaB, schameC
等中是相同的。我可以使用相同的 Foo
class 对来自不同模式的每个表进行操作吗?
如果您的数据库具有相同的模式,您完全可以在多个数据库中使用相同的模型。事实上,当人们从一个数据库到另一个数据库进行 ETL 时,通常会这样做。
典型的程序如下所示:
Base.open(/*connection params*/);
List<Person> johns = Person.where("first_name = ?", "John");
Base.close();
Base.open()
打开一个连接并将其附加到当前线程。
- 下一行
Person.where(..)
在线程上找到一个连接,并将其用于 select 记录。
Base.close()
在当前线程上找到一个连接并关闭它。
此外,ActiveJDBC 模型首次在 JVM 中使用时,会期望在当前线程上建立连接,并会从当前模式中提取元数据。这将确保:
- 表格与模型相关(http://javalite.io/english_inflections)
- 模型知道它们的属性(列)
- 模型发现关系(多对多、一对多等)
这意味着在任何给定时间,模型假定它连接到具有用于获取元数据的相同结构的数据库。
接下来,这可能是您想要的:
Base.open(/*connection params for DB1*/);
List<Person> johns = Person.where("first_name = ?", "John");
Base.close();
Base.open(/*connection params for DB2*/);
for(Person person:johns){
person.set("first_name", "Bill").setId(null).saveIt();
}
Base.close();
本质上,您将从一个数据库中读取数据,但会将其保存到另一个数据库中。
需要调用 person.setId(null)
以确保框架生成插入而不是更新,请参阅 http://javalite.io/surrogate_primary_keys。
我有一个多租户数据库架构。有没有办法对多个相同的数据库使用一个活动模型?
一点说明:
我有一个 Foo exdends Model
class 可以与 foo_table
一起使用。 foo_table
在 schemaA, schemaB, schameC
等中是相同的。我可以使用相同的 Foo
class 对来自不同模式的每个表进行操作吗?
如果您的数据库具有相同的模式,您完全可以在多个数据库中使用相同的模型。事实上,当人们从一个数据库到另一个数据库进行 ETL 时,通常会这样做。
典型的程序如下所示:
Base.open(/*connection params*/);
List<Person> johns = Person.where("first_name = ?", "John");
Base.close();
Base.open()
打开一个连接并将其附加到当前线程。- 下一行
Person.where(..)
在线程上找到一个连接,并将其用于 select 记录。 Base.close()
在当前线程上找到一个连接并关闭它。
此外,ActiveJDBC 模型首次在 JVM 中使用时,会期望在当前线程上建立连接,并会从当前模式中提取元数据。这将确保:
- 表格与模型相关(http://javalite.io/english_inflections)
- 模型知道它们的属性(列)
- 模型发现关系(多对多、一对多等)
这意味着在任何给定时间,模型假定它连接到具有用于获取元数据的相同结构的数据库。
接下来,这可能是您想要的:
Base.open(/*connection params for DB1*/);
List<Person> johns = Person.where("first_name = ?", "John");
Base.close();
Base.open(/*connection params for DB2*/);
for(Person person:johns){
person.set("first_name", "Bill").setId(null).saveIt();
}
Base.close();
本质上,您将从一个数据库中读取数据,但会将其保存到另一个数据库中。
需要调用 person.setId(null)
以确保框架生成插入而不是更新,请参阅 http://javalite.io/surrogate_primary_keys。