1.4-多个Connection_qq_27664967的博客-程序员秘密

技术标签: typeorm官方文档  

多个连接,数据库,模式和主从复制设置

使用多个连接

使用多个数据库的最简单方法是创建不同的连接:

import {
    createConnections} from "typeorm";

const connections = await createConnections([{
    
    name: "db1Connection",
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "root",
    password: "admin",
    database: "db1",
    entities: [__dirname + "/entity/*{.js,.ts}"],
    synchronize: true
}, {
    
    name: "db2Connection",
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "root",
    password: "admin",
    database: "db2",
    entities: [__dirname + "/entity/*{.js,.ts}"],
    synchronize: true
}]);

此方法允许你连接到已拥有的任意数量的数据库,每个数据库都有自己的配置,自己的实体和整体ORM范围和设置。

对于每个连接,将创建一个新的Connection实例。
你必须为创建的每个连接指定唯一的名称。

也可以从ormconfig文件加载所有连接选项:

import {
    createConnections} from "typeorm";

const connections = await createConnections();

指定要按名称创建的连接:

import {
    createConnection} from "typeorm";

const connection = await createConnection("db2Connection");

使用连接时,必须指定连接名称以获取特定连接:

import {
    getConnection} from "typeorm";

const db1Connection = getConnection("db1Connection");
// 现在可以使用"db1"数据库...

const db2Connection = getConnection("db2Connection");
// 现在可以使用"db2"数据库...

使用此方法的好处是你可以使用不同的登录凭据,主机,端口甚至数据库类型来配置多个连接。

但是缺点可能是需要管理和使用多个连接实例。

在单个连接中使用多个数据库

如果你不想创建多个连接,但是想在一个连接中使用多个数据库,则可以指定使用的每个实体的数据库名称:

import {
    Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity({
     database: "secondDB" })
export class User {
    

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

}
import {
    Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity({
     database: "thirdDB" })
export class Photo {
    

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    url: string;

}

user实体将在secondDB数据库内创建,Photo实体则在thirdDB数据库内。

如果要从其他数据库中选择数据,则只需提供一个实体:

const users = await connection
    .createQueryBuilder()
    .select()
    .from(User, "user")
    .addFrom(Photo, "photo")
    .andWhere("photo.userId = user.id")
    .getMany(); // userId因其跨数据库请求而不是外键

此代码将生成以下sql查询(取决于数据库类型):

SELECT * FROM "secondDB"."question" "question", "thirdDB"."photo" "photo" 
    WHERE "photo"."userId" = "user"."id"

还可以指定表而不是实体:

const users = await connection
    .createQueryBuilder()
    .select()
    .from("secondDB.user", "user")
    .addFrom("thirdDB.photo", "photo")
    .andWhere("photo.userId = user.id")
    .getMany(); // userId因其跨数据库请求而不是外键

仅在mysql和mssql数据库中支持此功能。

在单个连接中使用多个模式

你可以在应用程序中使用多个模式,只需在每个实体上设置schema

import {
    Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity({
     schema: "secondSchema" })
export class User {
    

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

}
import {
    Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity({
     schema: "thirdSchema" })
export class Photo {
    

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    url: string;

}

user实体将在secondSchema schema中创建,photo实体将在thirdSchema schema中创建。

其他实体将在默认连接架构中创建。

如果要从其他模式中选择数据,则只需提供一个实体:

const users = await connection
    .createQueryBuilder()
    .select()
    .from(User, "user")
    .addFrom(Photo, "photo")
    .andWhere("photo.userId = user.id")
    .getMany(); // userId因其跨数据库请求而不是外键

此代码将生成以下sql查询(取决于数据库类型):

SELECT * FROM "secondSchema"."question" "question", "thirdSchema"."photo" "photo" 
    WHERE "photo"."userId" = "user"."id"

你还可以指定表而不是实体:

const users = await connection
    .createQueryBuilder()
    .select()
    .from("secondSchema.user", "user") // 在mssql中,指定数据库:secondDB.secondSchema.user
    .addFrom("thirdSchema.photo", "photo") // 在mssql中,指定数据库:thirdDB.thirdSchema.photo
    .andWhere("photo.userId = user.id")
    .getMany();

仅在postgres和mssql数据库中支持此功能。

在mssql中,你还可以组合模式和数据库,例如:

import {
    Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity({
     database: "secondDB", schema: "public" })
export class User {
    

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

}

主从复制

你可以使用TypeORM设置读/写复制。

复制连接设置示例:

{
    
  type: "mysql",
  logging: true,
  replication: {
    
    master: {
    
      host: "server1",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    },
    slaves: [{
    
      host: "server2",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }, {
    
      host: "server3",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }]
  }
}

所有模式更新和写入操作都使用master服务器执行。
find方法或select query builder执行的所有简单查询都使用随机的slave实例。

如果要在查询构建器创建的SELECT中显式使用master,可以使用以下代码:

const masterQueryRunner = connection.createQueryRunner("master");
try {
    
    const postsFromMaster = await connection.createQueryBuilder(Post, "post")
        .setQueryRunner(masterQueryRunner)
        .getMany();
} finally {
    
      await masterQueryRunner.release();
}

请注意,需要显式释放由QueryRunner创建的连接。

mysql,postgres和sql server数据库都支持复制。

Mysql支持深度配置:

{
    
  replication: {
    
    master: {
    
      host: "server1",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    },
    slaves: [{
    
      host: "server2",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }, {
    
      host: "server3",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }],
    
    /**
    * 如果为true,则PoolCluster将在连接失败时尝试重新连接。 (默认值:true)
    */
    canRetry: true,

    /**
     * 如果连接失败,则节点的errorCount会增加。
     * 当errorCount大于removeNodeErrorCount时,删除PoolCluster中的节点。 (默认值:5)
     */
    removeNodeErrorCount: 5,

    /**
     * 如果连接失败,则指定在进行另一次连接尝试之前的毫秒数。
     * 如果设置为0,则将删除节点,并且永远不会重复使用。 (默认值:0)
     */
     restoreNodeTimeout: 0,

    /**
     * 确定如何选择从库:
     * RR:交替选择一个(Round-Robin)。
     * RANDOM: 通过随机函数选择节点。
     * ORDER: 无条件选择第一个
     */
    selector: "RR"
  }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27664967/article/details/107363013

智能推荐

H3C管理设备控制台,交换机Trunk端口配置_h3c设备管理控制台_风风biu的博客-程序员秘密

第二周开始了,开始搞真机,看着那个比我还高的机柜,莫名的紧张和兴奋。。。首先得熟络H3CSE实验手册,内含六项内容。我想着还是得先从HCL模拟器上配置出来,再到真机上配置。配出来了,还是得认真,忘记保存了一次。。。进行真机的talet连接时必须用火狐浏览器,或者用其他浏览器得安装注册表。真机上四个交换机和两个AP需要进行console口连接笔记本电脑进行初始配置,然而下午又全好...

excel调用python编程-超简单:用Python让Excel飞起_weixin_37988176的博客-程序员秘密

本书对于编程知识零基础的办公人士特别友好,其摒弃了晦涩的理论讲解,引入了实用的办公场景,为办公人士开辟了一条学习办公自动化的新路。本书精选典型办公案例以及通俗易懂的讲解,有助于办公人士掌握Python+Excel的联合使用,也有利于读者在大数据的应用上能够更进一步。本书代码简洁、思路清晰,在学习过程中只需简单地修改一下本书附赠代码就能够应用到实际的工作场景中,让学习和工作事半功倍。本书是一本讲解如...

uni-app十分钟光速入门笔记(持续更新中...)_\ue534_Rudon滨海渔村的博客-程序员秘密

光速入门下载安装HBuilderX(前端御用)HBuilderX-高效极客技巧 选择“App开发版” 在左边的项目管理器中右键,新建,项目,填写项目名称“xxx”,选择“uni-app”类别的“Hello uni-app”即可快速创建完整架构的uni-app项目 展开项目xxx,双击打开App.vue,点击右上角的预览,即可看到项目的效果 学习uni-app,并修改项目到你满意为止。(这一步放在文章最下面:UniApp一步一步来) 如何导出呢? 点击菜单栏“发行”,选择对应发行环境即可获得完

跑分软件测试的游戏是,主流软件跑分测试 日常游戏无压力_很圆的方块的博客-程序员秘密

主流软件跑分测试 日常游戏无压力新款骁龙820移动平台放弃了ARM公版架构,采用了高通自主64位Kyro架构,最高频率可达2.2GHz,性能相比骁龙810提升了两倍,高通对不仅对新的架构做出了优化还花重金用上了三星的14nm LPP工艺,骁龙820移动平台用的四核Kyro(2+2)核心。在图片处理方面也是很强劲的,拥有Adreno 530 GPU,支持OpenGL ES 3.1+AEP、OpenC...

宇视监控摄像头使用什么工具批量修改IP地址_宇视摄像头ip修改工具_宇视科技400服务的博客-程序员秘密

官网下载EZtools工具(详细操作视频链接:EZTools下载和安装https://www.bilibili.com/video/BV1Lf4y1K7xH?spm_id_from=333.999.0.0EZtools修改地址EZtools修改地址)

随便推点

debug and release_chaooooooo的博客-程序员秘密

Surviving the Release VersionHomeBack To Tips PageOK, your program works. You've tested everything in sight. It's time to ship it. So you make a release version. 

CentOS7 shell脚本一键安装 php mysql redis nginx 源码安装_qq_37446368的博客-程序员秘密

PHP 7.3nginx 1.16mysql 5.7.22redis 4.0# 版本配置# 注意: 修改版本可以在这直接修改。 修改路径,还是要结合代码做修改!!!PHP="7.3.9"NGINX="1.16.1"MYSQL_MAIN="5.7"MYSQL_DETIAL="5.7.22"MYSQL="/usr/local/mysql"MYSQL_DATA="/usr/loca...

java技术选型案例,微服务架构案例(01):项目技术选型简介,架构图解说明_sijin yu的博客-程序员秘密

本文源码:[GitHub·点这里](https://github.com/cicadasmile) || [GitEE·点这里](https://gitee.com/cicadasmile)# 一、单体架构单体架构在中等偏小的业务中比较常见,场景模式就是单个应用、单个数据库。一个程序包(例如war格式或者Jar格式)包含所有业务需求功能,这是一种比较传统的架构风格。**单体架构的缺陷**1. 复...

Flowable深入浅出-7 Flowable-Modeler集成之Flowable源码编译_flowable 源码_书山登峰人的博客-程序员秘密

7 Flowable-Modeler集成之Flowable源码编译背景源码下载Flowable完整源码编译Flowable编译结果查看Flowable编译结果验证Flowable源码编译的意义打赏版权背景网上看到好多用户期望集成Flowable的modeler,本文开始将一步步研究Flowable的集成策略,并在后面几个课程中完成modeler的集成。源码下载参考文章https://bl...

剑指offer 专项突破版 102、加减的目标值_抓抓璐璐小可爱(๑• . •๑)的博客-程序员秘密

题目链接思路这个题目首先在于转化,把题目转化为从数组中选出一些数,使他们的和为 sum+target >> 1设f(i,j)为前i个元素可以选出和为j的子元素的选法如果不选择第i个 f(i,j) = f(i-1,j)如果选择第i个 f(i,j) = f(i-1,j-nums[j])class Solution { public int findTargetSumWays(int[] nums, int target) { int su

linux文件、目录权限和所有者_baiyong8646的博客-程序员秘密

文件、目录权限和所有者简介:用户对一个文件或目录具有访问权限,这些访问权限决定了谁能访问,以及如何范围这些文件和目录。通过设置权限可以限制或允许以下三种用户访问:文件的用户所有者(属主)文件的组群所有者(用户所在组的同组用户)系统中的其他用户在linux系统中,每一位用户都有对文件或目录的的读取、写入和执行权限。第一套权限控制访问自己的文件权限,即所有...

推荐文章

热门文章

相关标签