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

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

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

PostgreSQL client

CI

这是一个用于连接和查询PostgreSQL数据库的库(参见 Postgres Protocol)。此驱动程序使用PostgreSQL协议的更高效且安全的扩展查询格式。

使用方法

创建一个Connection

final conn = await Connection.open(Endpoint(
  host: 'localhost',
  database: 'postgres',
  username: 'user',
  password: 'pass',
));

执行查询

final result = await conn.execute("SELECT 'foo'");
print(result[0][0]); // 第一行和第一列

命名参数,返回行作为列名映射

final result = await conn.execute(
  Sql.named('SELECT * FROM a_table WHERE id=@id'),
  parameters: {'id': 'xyz'},
);
print(result.first.toColumnMap());

在事务中执行查询

await conn.runTx((s) async {
  final rs = await s.execute('SELECT count(*) FROM foo');
  await s.execute(
    r'UPDATE a_table SET totals=$1 WHERE id=$2',
    parameters: [rs[0][0], 'xyz'],
  );
});

更多API文档请参阅:API 文档

连接池

该库支持连接池(并隐藏作为常规会话执行器的连接池)。

自定义类型编解码器

该库支持通过ConnectionSettings.typeRegistry注册自定义类型编解码器(和通用对象编码器)。

流式复制协议

该库支持使用流式复制协议连接到PostgreSQL。详情请参阅Connection文档。您还可以在以下仓库中找到示例:postgresql-dart-replication-example

其他注意事项

此库最初是StableKernel的postgres库,但对其API进行了全面改造,并部分重写了内部结构。

请在问题追踪器上提交功能请求和bug报告。

示例代码

下面是一个完整的示例代码,演示如何使用postgres包:

/// `postgres`包的示例。
///
/// 运行此示例需要访问PostgreSQL服务器。如果您安装了Docker,则可以通过运行以下命令启动PostgreSQL服务器以运行此示例:
///
/// ```
/// docker run --detach --name postgres_for_dart_test -p 127.0.0.1:5432:5432 -e POSTGRES_USER=user -e POSTGRES_DATABASE=database -e POSTGRES_PASSWORD=pass postgres
/// ```
///
/// 测试完成后,要停止并清除数据库服务器,请运行:
///
/// ```
/// docker container rm --force postgres_for_dart_test
/// ```

library;

import 'package:postgres/postgres.dart';

void main() async {
  final conn = await Connection.open(
    Endpoint(
      host: 'localhost',
      database: 'postgres',
      username: 'user',
      password: 'pass',
    ),
    // 如果您通过互联网访问PostgreSQL服务器,服务器应支持SSL,并应将模式替换为`SslMode.verifyFull`。
    settings: ConnectionSettings(sslMode: SslMode.disable),
  );
  print('已建立连接!');

  // 简单查询无结果
  await conn.execute('CREATE TABLE IF NOT EXISTS a_table ('
      '  id TEXT NOT NULL, '
      '  totals INTEGER NOT NULL DEFAULT 0'
      ')');

  // 简单查询
  final result0 = await conn.execute("SELECT 'foo'");
  print(result0[0][0]); // 第一行,第一列

  // 使用预处理语句提供值
  final result1 = await conn.execute(
    r'INSERT INTO a_table (id) VALUES ($1)',
    parameters: ['example row'],
  );
  print('插入了 ${result1.affectedRows} 行');

  // 命名参数查询
  final result2 = await conn.execute(
    Sql.named('SELECT * FROM a_table WHERE id=@id'),
    parameters: {'id': 'example row'},
  );
  print(result2.first.toColumnMap());

  // 事务
  await conn.runTx((s) async {
    final rs = await s.execute('SELECT count(*) FROM a_table');
    await s.execute(
      r'UPDATE a_table SET totals=$1 WHERE id=$2',
      parameters: [rs[0][0], 'xyz'],
    );
  });

  // 预处理语句
  final statement = await conn.prepare(Sql("SELECT 'foo';"));
  final result3 = await statement.run([]);
  print(result3);
  await statement.dispose();

  // 带类型的预处理语句
  final anotherStatement =
      await conn.prepare(Sql(r'SELECT $1;', types: [Type.bigInteger]));
  final bound = anotherStatement.bind([1]);
  final subscription = bound.listen((row) {
    print('row: $row');
  });
  await subscription.asFuture();
  await subscription.cancel();
  print(await subscription.affectedRows);
  print(await subscription.schema);

  await conn.close();
}

这个示例展示了如何使用postgres包进行基本的数据库操作,包括创建表、插入数据、查询数据、使用命名参数、执行事务以及使用预处理语句等。希望这对您有所帮助!


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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用postgres数据库连接插件的示例。需要注意的是,由于Flutter运行在移动设备上,直接连接PostgreSQL数据库并不常见且不推荐(因为涉及安全、性能和网络问题)。通常的做法是通过后端服务器(如Node.js、Django、Flask等)来与PostgreSQL交互,Flutter应用则通过HTTP请求与后端服务器通信。

不过,如果你确实需要在Flutter中直接处理PostgreSQL(通常用于桌面或Web应用),你可能需要借助一些第三方库和桥接技术。然而,直接连接的库非常少见,且通常涉及复杂的设置。

这里我将展示一个更常见的做法:通过Flutter的HTTP客户端(如diohttp包)与后端服务器通信,后端服务器再与PostgreSQL数据库交互。

后端服务器示例(Node.js + Express + pg)

首先,设置一个Node.js后端服务器,使用Express框架和pg库来连接PostgreSQL。

// server.js
const express = require('express');
const { Pool } = require('pg');
const cors = require('cors');

const app = express();
const port = 3000;

const pool = new Pool({
  user: 'yourUsername',
  host: 'localhost',
  database: 'yourDatabase',
  password: 'yourPassword',
  port: 5432,
});

app.use(cors());

app.get('/api/data', async (req, res) => {
  const client = await pool.connect();
  try {
    const res = await client.query('SELECT * FROM yourTable');
    res.rows.forEach((row) => {
      console.log(row);
    });
    res.send(res.rows);
  } catch (err) {
    console.error(err);
    res.status(500).send('Server error');
  } finally {
    client.release();
  }
});

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}`);
});

Flutter客户端示例

接下来,在Flutter中使用dio库来与后端服务器通信。

  1. 添加依赖:
# pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.0  # 确保使用最新版本
  1. 创建一个Flutter服务来与后端通信:
// api_service.dart
import 'package:dio/dio.dart';

class ApiService {
  static final String baseUrl = "http://localhost:3000";
  final Dio dio;

  ApiService() {
    dio = Dio();
    dio.options.baseUrl = baseUrl;
  }

  Future<List> fetchData() async {
    try {
      Response response = await dio.get('/api/data');
      return response.data.cast<Map<String, dynamic>>();
    } catch (e) {
      print(e);
      return [];
    }
  }
}
  1. 在你的Flutter组件中使用这个服务:
// main.dart
import 'package:flutter/material.dart';
import 'api_service.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List data = [];
  ApiService apiService = ApiService();

  @override
  void initState() {
    super.initState();
    fetchData();
  }

  void fetchData() async {
    data = await apiService.fetchData();
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter PostgreSQL Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Data from PostgreSQL:'),
            Expanded(
              child: ListView.builder(
                itemCount: data.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text(data[index]['yourColumnName'].toString()),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个例子中,Flutter应用通过HTTP请求与Node.js后端服务器通信,后端服务器再与PostgreSQL数据库交互。这是处理Flutter应用中与PostgreSQL数据库交互的一种安全且高效的方式。

回到顶部