Flutter数据库交互插件deno_postgres_interop的使用

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

Flutter数据库交互插件deno_postgres_interop的使用

插件简介

deno_postgres_interop 是一个允许在Dart中使用Deno Postgres的包,特别是为了支持在Deno Deploy上运行的dart_edge。它通过创建与js库的互操作绑定来实现这一点,因为其他驱动程序依赖于dart:io并且无法在此环境中工作。主要应用场景是Supabase Edge Functions,但也适用于其他dart2js编译场景。

style: solid $solid_lints

注意:由于dart_edge中的bug,SDK版本>= 3.1.0实际上不被支持。

使用方法(以Supabase edge functions为例)

步骤1:添加依赖

在你的pubspec.yaml文件中添加deno_postgres_interop依赖:

dependencies:
  deno_postgres_interop: <INSERT LATEST VERSION>

或者直接通过命令行添加:

dart pub add deno_postgres_interop

步骤2:导入包

在需要进行PostgreSQL交互的Dart文件中引入此包:

import 'package:deno_postgres_interop/deno_postgres_interop.dart';

步骤3:编译代码

确保你使用正确的命令来编译包含此包的代码,例如针对Supabase Functions:

dart run edge build supabase_functions

步骤4:添加必要的导入语句到生成文件

这一步是为了确保所有必要的JavaScript库都被正确地导入到了最终生成的JS文件中:

dart run deno_postgres_interop:add_imports \
  --filename=example/functions/dart_edge/main.dart.js

注意:请根据实际情况调整文件路径。

步骤5:编写并使用函数

现在你可以开始编写和使用与PostgreSQL交互的功能了。下面是一个简单的例子,展示了如何连接到PostgreSQL数据库、执行事务以及处理查询结果。

示例代码

import 'package:deno_postgres_interop/deno_postgres_interop.dart';
import 'package:supabase_functions/supabase_functions.dart';

void main() => SupabaseFunctions(fetch: fetch);

Future<Response> fetch(Request _) async {
  // 获取环境变量中的数据库URL
  final dbUrl = Deno.env.get('SUPABASE_DB_URL');
  if (dbUrl == null) return Response.error();

  // 创建客户端并尝试连接
  final client = Client(dbUrl);
  await client.connect();
  try {
    // 执行一个事务
    final result = await client.transaction(
      'transaction',
      transaction,
      TransactionOptions(isolationLevel: IsolationLevel.serializable),
    );
    await client.end();

    // 格式化返回的数据
    return Response([
      result.command == CommandType.select,
      'warnings = ${result.warnings}',
      '''
rowDescription =
  columnCount = ${result.rowDescription?.columnCount}
  columns =
${result.rowDescription?.columns.map((e) => '    name = ${e.name}').join('\n')}
      ''',
      result.query.resultType,
      ...result.rows.map(rowToPrettyString),
    ].join('\n\n'));
  } on TransactionError catch (e) {
    await client.end();

    // 如果发生错误,则捕获异常并返回错误信息
    return Response('''
${e.name}
${e.cause}
  ${e.cause.name}
  ${e.cause.cause}
  ${e.cause.message}
  ${e.cause.fields}
${e.message}
$e
''');
  }
}

// 定义事务内要执行的操作
Future<QueryObjectResult<dynamic>> transaction(Transaction transaction) async {
  // 更新用户表中的记录
  await transaction.queryObject(
    'UPDATE public."User" '
    r'SET username=$1 '
    "WHERE last_name='user'"
    'AND y = z',
    ["'user${transaction.hashCode}'"],
  );
  await Future.delayed(const Duration(seconds: 10));

  // 查询所有用户
  return transaction.queryObject('SELECT * FROM public."User"');
}

// 将每一行的结果格式化为字符串表示形式
String rowToPrettyString(Map<String, dynamic> row) =>
    row.toString().replaceAll(', ', '\n').replaceAllMapped(RegExp(r'\{|\}'), (_) => '');

这个示例演示了如何使用deno_postgres_interop与PostgreSQL数据库交互,并且包含了对可能出现的问题的基本处理方式。希望这份指南对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


在Flutter应用中与数据库进行交互时,通常会使用原生的Flutter插件或者通过平台通道(Platform Channels)与原生代码进行交互。然而,deno_postgres_interop 这个名字听起来并不是一个标准的Flutter插件,因为它似乎结合了Deno(一个JavaScript和TypeScript的运行时)和PostgreSQL(一个流行的关系型数据库)。在Flutter中,我们一般不会直接使用Deno进行数据库操作,而是使用专门的Flutter插件或者通过平台通道调用原生代码(如Dart中的package:postgres或者其他数据库客户端库,但这些通常是针对服务器端Dart或Deno,而非Flutter)。

不过,为了展示如何在Flutter中与PostgreSQL数据库交互,我们可以使用Flutter的HTTP客户端库(如diohttp包)来发送请求到一个用Deno编写的后端服务,该后端服务再与PostgreSQL进行交互。下面是一个简化的例子,展示如何使用Flutter前端和Deno后端进行通信。

Flutter前端代码

首先,在Flutter项目中添加HTTP客户端库,例如dio

# 在pubspec.yaml中添加依赖
dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.0  # 请检查最新版本号

然后,在Flutter应用中发送HTTP请求:

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter with Deno Backend'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 创建Dio实例
              final dio = Dio();
              try {
                // 发送GET请求到Deno后端
                var response = await dio.get('http://localhost:8080/data');
                // 显示响应数据
                print(response.data);
              } catch (e) {
                // 处理错误
                print(e);
              }
            },
            child: Text('Fetch Data'),
          ),
        ),
      ),
    );
  }
}

Deno后端代码

在Deno项目中,使用oak框架创建一个简单的HTTP服务器,并使用pg库与PostgreSQL数据库交互:

  1. 安装依赖:
deno install -A --allow-net --allow-read --allow-env https://deno.land/x/deno_install/install.ts
deno install -n deno_postgres_interop --allow-net --allow-read --allow-env -f ./mod.ts
  1. 创建mod.ts文件:
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
import { Pool } from "https://deno.land/x/postgres/mod.ts";

// 配置PostgreSQL连接池
const pool = new Pool({
  user: "your_db_user",
  password: "your_db_password",
  database: "your_db_name",
  hostname: "localhost",
  port: 5432,
});

// 创建Oak应用
const app = new Application();
const router = new Router();

// 定义一个获取数据的路由
router.get("/data", async (context: any) => {
  const client = await pool.connect();
  try {
    const result = await client.query("SELECT * FROM your_table");
    context.response.body = result.rows;
  } catch (error) {
    console.error(error);
    context.response.status = 500;
    context.response.body = { error: "Internal server error" };
  } finally {
    client.release();
  }
});

// 使用路由
app.use(router.routes());
app.use(router.allowedMethods());

// 启动服务器
await app.listen({ port: 8080 });
console.log("Server is running on http://localhost:8080");

运行项目

  1. 启动Deno后端服务:
deno run --allow-net --allow-read --allow-env mod.ts
  1. 在Flutter模拟器或设备上运行Flutter应用。

这个示例展示了如何通过Flutter前端发送HTTP请求到Deno后端,然后Deno后端与PostgreSQL数据库进行交互并返回数据。虽然这不是直接使用deno_postgres_interop(因为这个名字可能并不对应一个实际的Flutter插件),但它展示了如何在Flutter项目中与Deno后端服务以及PostgreSQL数据库进行交互的一种常见方法。

回到顶部