• 数据库连接
    • 什么是Connection
    • 创建新的连接
    • 使用ConnectionManager
    • 使用连接

    数据库连接

    什么是Connection

    只有在建立连接后才能与数据库进行交互。 TypeORM 的Connection不会像看起来那样设置单个数据库连接,而是设置连接池。 如果你对数据库连接感兴趣,请参阅QueryRunner文档。 QueryRunner的每个实例都是一个独立的数据库连接。一旦调用Connectionconnect方法,就建立连接池设置。 如果使用createConnection函数设置连接,则会自动调用connect方法。调用close时会断开连接(关闭池中的所有连接)。 通常情况下,你只能在应用程序启动时创建一次连接,并在完全使用数据库后关闭它。实际上,如果要为站点构建后端,并且后端服务器始终保持运行,则不需要关闭连接。

    创建新的连接

    有多种方法可以创建连接。但是最简单和最常用的方法是使用createConnectioncreateConnections函数。

    createConnection 创建单个连接:

    1. import { createConnection, Connection } from "typeorm";
    2. const connection = await createConnection({
    3. type: "mysql",
    4. host: "localhost",
    5. port: 3306,
    6. username: "test",
    7. password: "test",
    8. database: "test"
    9. });

    只使用urltype也可以进行连接。

    1. createConnection({
    2. type: "postgres",
    3. url: "postgres://test:test@localhost/test"
    4. });

    createConnections 创建多个连接:

    1. import { createConnections, Connection } from "typeorm";
    2. const connections = await createConnections([
    3. {
    4. name: "default",
    5. type: "mysql",
    6. host: "localhost",
    7. port: 3306,
    8. username: "test",
    9. password: "test",
    10. database: "test"
    11. },
    12. {
    13. name: "test2-connection",
    14. type: "mysql",
    15. host: "localhost",
    16. port: 3306,
    17. username: "test",
    18. password: "test",
    19. database: "test2"
    20. }
    21. ]);

    这两种方式都根据你传递的连接选项创建Connection,并调用connect方法。另外你也可以在项目的根目录中创建一个ormconfig.json文件,createConnectioncreateConnections将自动从此文件中读取连接选项。项目的根目录与node_modules目录的级别相同。

    1. import { createConnection, createConnections, Connection } from "typeorm";
    2. // createConnection将从ormconfig.json / ormconfig.js / ormconfig.yml / ormconfig.env / ormconfig.xml 文件或特殊环境变量中加载连接选项
    3. const connection: Connection = await createConnection();
    4. // 你可以指定要创建的连接的名称
    5. // (如果省略名称,则将创建没有指定名称的连接)
    6. const secondConnection: Connection = await createConnection("test2-connection");
    7. // 如果调用createConnections而不是createConnection
    8. // 它将初始化并返回ormconfig文件中定义的所有连接
    9. const connections: Connection[] = await createConnections();

    不同的连接必须具有不同的名称默。认情况下,如果未指定连接名称,则为default。 通常在你使用多个数据库或多个连接配置时才会使用多连接。

    创建连接后,你可以使用getConnection函数从应用程序中的任何位置使用它:

    1. import { getConnection } from "typeorm";
    2. // 可以在调用createConnection后使用并解析
    3. const connection = getConnection();
    4. // 如果你有多个连接,则可以按名称获取连接
    5. const secondConnection = getConnection("test2-connection");

    应避免额外创建 classes/services 来存储和管理连接。此功能已嵌入到 TypeORM 中 - 无需过度工程并创建无用的抽象。

    使用ConnectionManager

    你可以使用ConnectionManager类创建连接。例如:

    1. import { getConnectionManager, ConnectionManager, Connection } from "typeorm";
    2. const connectionManager = getConnectionManager();
    3. const connection = connectionManager.create({
    4. type: "mysql",
    5. host: "localhost",
    6. port: 3306,
    7. username: "test",
    8. password: "test",
    9. database: "test"
    10. });
    11. await connection.connect(); // 执行连接

    这不是常规创建连接的方法,但它可能对某些用户有用。例如,想要创建连接并存储其实例,同时控制何时建立实际”connection”。你还可以创建和维护自己的ConnectionManager

    1. import { getConnectionManager, ConnectionManager, Connection } from "typeorm";
    2. const connectionManager = new ConnectionManager();
    3. const connection = connectionManager.create({
    4. type: "mysql",
    5. host: "localhost",
    6. port: 3306,
    7. username: "test",
    8. password: "test",
    9. database: "test"
    10. });
    11. await connection.connect(); // 执行连接

    但请注意,使用该方式,你将无法再使用getConnection() - 你需要存储连接管理器实例,并使用connectionManager.get来获取所需的连接。

    通常情况下为避免应用程序中出现不必要的复杂情况,应尽量少使用此方法,除非你确实认为需要时才使用ConnectionManager

    使用连接

    设置连接后,可以使用getConnection函数在应用程序的任何位置使用它:

    1. import { getConnection } from "typeorm";
    2. import { User } from "../entity/User";
    3. export class UserController {
    4. @Get("/users")
    5. getAll() {
    6. return getConnection().manager.find(User);
    7. }
    8. }

    你也可以使用ConnectionManager#get来获取连接,但在大多数情况下使用getConnection()就足够了。

    使用 Connection,你可以对实体执行数据库操作,尤其是使用连接的EntityManagerRepository。 有关它们的更多信息,请参阅Entity Manager 和 Repository 文档。

    但一般来说,你不要太多使用Connection。大多数情况下,你只需创建连接并使用getRepository()getManager()来访问连接的管理器和存储库,而无需直接使用连接对象:

    1. import { getManager, getRepository } from "typeorm";
    2. import { User } from "../entity/User";
    3. export class UserController {
    4. @Get("/users")
    5. getAll() {
    6. return getManager().find(User);
    7. }
    8. @Get("/users/:id")
    9. getAll(@Param("id") userId: number) {
    10. return getRepository(User).findOne(userId);
    11. }
    12. }