Flutter数据库连接插件postgres的使用
Flutter数据库连接插件postgres的使用
PostgreSQL client
这是一个用于连接和查询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
更多关于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客户端(如dio
或http
包)与后端服务器通信,后端服务器再与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
库来与后端服务器通信。
- 添加依赖:
# pubspec.yaml
dependencies:
flutter:
sdk: flutter
dio: ^4.0.0 # 确保使用最新版本
- 创建一个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 [];
}
}
}
- 在你的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数据库交互的一种安全且高效的方式。