Flutter数据库连接插件serverpod_postgres_pool的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter数据库连接插件serverpod_postgres_pool的使用

简介

serverpod_postgres_pool 是一个用于控制与单个 PostgreSQL 服务器最大连接数的库。它基于 package:postgres 提供的功能,允许你高效地管理数据库连接池。


使用方法

创建 PgPool 对象

首先,你需要创建一个 PgPool 对象来管理数据库连接池。你可以通过传递 PgEndpoint 参数来指定数据库连接信息,例如主机名、端口、数据库名称、用户名和密码。

final pg = PgPool(
  PgEndpoint(
      host: 'localhost', // 数据库服务器地址
      port: 5432,       // 数据库端口号
      database: 'test', // 数据库名称
      username: 'test', // 用户名
      password: 'test'),// 密码
);

执行非事务性操作

你可以使用 pg.run 方法来执行非事务性的数据库操作。该方法会自动从连接池中获取一个可用连接,并在操作完成后将其归还到连接池中。

示例代码

final futures = <Future>[];
for (var i = 0; i < 100; i++) {
  // pg.run 调度一个回调函数,在有可用连接时执行。
  final f = pg.run((c) async {
    final rs = await c.query(
      'SELECT COUNT(*) FROM test_table WHERE type = @type',
      substitutionValues: {
        'type': i, // 替换查询参数
      },
    );
    return rs[0][0]; // 返回查询结果
  });

  futures.add(f); // 将异步任务添加到列表中
}

// 等待所有异步任务完成
await Future.wait(futures);

// 关闭连接池
await pg.close();

解释

  1. pg.run:将每个查询操作调度为异步任务,并返回一个 Future
  2. substitutionValues:用于替换 SQL 查询中的占位符(如 @type)。
  3. Future.wait:等待所有异步任务完成,确保所有查询都已执行完毕。
  4. pg.close:关闭连接池,释放所有资源。

执行事务性操作

如果你需要执行事务性操作,可以使用 pg.runTx 方法。该方法会在一个事务中执行多个数据库操作,并在成功后提交事务。

示例代码

await pg.runTx((conn) async {
  await conn.query('BEGIN'); // 开始事务

  // 执行多个数据库操作
  await conn.query('INSERT INTO test_table (id, name) VALUES ([@id](/user/id), [@name](/user/name))', 
                   substitutionValues: {'id': 1, 'name': 'Alice'});
  await conn.query('UPDATE test_table SET name = [@name](/user/name) WHERE id = [@id](/user/id)', 
                   substitutionValues: {'id': 1, 'name': 'Bob'});

  await conn.query('COMMIT'); // 提交事务
});

更多关于Flutter数据库连接插件serverpod_postgres_pool的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据库连接插件serverpod_postgres_pool的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


serverpod_postgres_pool 是一个用于 Flutter 和 Serverpod 的 PostgreSQL 数据库连接池插件。它允许你在 Serverpod 应用中高效地管理与 PostgreSQL 数据库的连接。以下是使用 serverpod_postgres_pool 的基本步骤:

1. 安装依赖

首先,你需要在 pubspec.yaml 文件中添加 serverpod_postgres_pool 依赖:

dependencies:
  serverpod_postgres_pool: ^1.0.0

然后运行 flutter pub get 来安装依赖。

2. 配置数据库连接池

在 Serverpod 项目中,你需要在 server.dart 文件中配置数据库连接池。以下是一个简单的配置示例:

import 'package:serverpod/serverpod.dart';
import 'package:serverpod_postgres_pool/serverpod_postgres_pool.dart';

class MyServerpod extends Serverpod {
  MyServerpod() : super('my_serverpod') {
    // 配置 PostgreSQL 连接池
    var postgresPool = PostgresPool(
      host: 'localhost',
      port: 5432,
      database: 'my_database',
      username: 'my_username',
      password: 'my_password',
      maxConnections: 10, // 最大连接数
    );

    // 将连接池添加到 Serverpod
    databasePoolManager = postgresPool;
  }
}

3. 使用数据库连接池

在你的 Serverpod 端点或服务中,你可以通过 session 对象访问数据库连接池,并执行 SQL 查询。以下是一个简单的示例:

import 'package:serverpod/serverpod.dart';

class MyEndpoint extends Endpoint {
  Future<List<Map<String, dynamic>>> getUsers(Session session) async {
    // 从连接池中获取一个连接
    var connection = await session.databasePoolManager.getConnection();

    try {
      // 执行查询
      var result = await connection.query('SELECT * FROM users');

      // 将结果转换为 Map 列表
      List<Map<String, dynamic>> users = [];
      for (var row in result) {
        users.add(row.toMap());
      }

      return users;
    } finally {
      // 释放连接
      session.databasePoolManager.releaseConnection(connection);
    }
  }
}

4. 处理数据库事务

如果你需要在事务中执行多个 SQL 操作,可以使用 connection.transaction 方法:

Future<void> updateUser(Session session, int userId, String newName) async {
  var connection = await session.databasePoolManager.getConnection();

  try {
    await connection.transaction((transaction) async {
      await transaction.query(
        'UPDATE users SET name = @name WHERE id = @id',
        substitutionValues: {
          'id': userId,
          'name': newName,
        },
      );

      // 你可以在这里执行更多的 SQL 操作
    });
  } finally {
    session.databasePoolManager.releaseConnection(connection);
  }
}

5. 关闭连接池

在 Serverpod 应用关闭时,建议关闭数据库连接池以释放资源:

class MyServerpod extends Serverpod {
  MyServerpod() : super('my_serverpod') {
    // 配置 PostgreSQL 连接池
    var postgresPool = PostgresPool(
      host: 'localhost',
      port: 5432,
      database: 'my_database',
      username: 'my_username',
      password: 'my_password',
      maxConnections: 10,
    );

    databasePoolManager = postgresPool;

    // 在应用关闭时关闭连接池
    onStop(() async {
      await postgresPool.close();
    });
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!