Flutter数据库连接插件edgedb的使用
Flutter数据库连接插件edgedb的使用
这是EdgeDB的官方Dart客户端库。如果您刚刚开始使用EdgeDB,我们建议先阅读EdgeDB快速入门,该指南将引导您完成安装EdgeDB、创建简单模式以及编写一些简单查询的过程。
注意: 只有EdgeDB版本 >= 2.0才受此库支持。
安装
在您的pubspec.yaml
文件中添加edgedb
依赖项:
dart pub add edgedb
此包包含核心的edgedb
库,它导出了所有连接到EdgeDB服务器并运行查询所需的API。此外,还包含edgeql-codegen
库,该库提供了Dart的build_runner
构建器,可以从.edgeql
文件生成完全类型化的查询方法。
基本用法
首先,您需要安装EdgeDB,并为您的项目创建一个实例;我们推荐快速入门指南以了解如何操作。
然后导入edgedb
库,并使用createClient()
创建一个新的客户端。
import 'package:edgedb/edgedb.dart';
final client = createClient();
在大多数情况下,createClient()
不需要任何参数;如果使用的是EdgeDB项目(开发推荐)或通过环境变量提供连接选项(生产推荐),库会自动确定如何连接到您的实例。有关更多高级用例,请参阅createClient()
的API文档。
现在您可以开始执行查询了:
void main() async {
final movie = await client.querySingle(r'''
select Movie {
title,
release_year,
actors: {
name,
@character_name
}
} filter .title = <str>$title
''', {
'title': 'Spider-man'
});
print(movie);
}
Client
类提供了多种方法来运行查询,可以选择返回JSON结果并强制执行结果基数。所有查询方法都有能力在安全的情况下从临时错误(如网络中断)中恢复。Client
还有API方便处理事务、设置查询的globals
以及其他客户端行为。有关详细信息,请参阅API文档。
类型安全
Client
上的基本查询方法返回的结果类型为dynamic
,并且只对传递给它们的查询参数的类型进行运行时检查。对于完全类型安全的查询,此包提供了一个build_runner
构建器在edgeql_codegen
库中。此构建器会读取项目中的任何.edgeql
文件,并在Client
类上生成扩展方法,这些方法返回完全类型化的结果,并接受正确类型的查询参数。
要使用edgeql_codegen
,首先在pubspec.yaml
文件中添加build_runner
依赖项:
dart pub add build_runner
默认情况下,edgeql_codegen
构建器会在所有.edgeql
文件旁边生成.edgeql.dart
文件,因此您可以直接运行build
或watch
命令而无需配置:
dart run build_runner build
# 或者
dart run build_runner watch
有关如何生成的类型是如何从.edgeql
查询转换的详细信息,请参阅edgeql_codegen
库的API文档。
要自定义构建过程,在项目根目录下创建一个build.yaml
文件,并遵循build_config文档。如果自定义了sources
配置,请确保排除dbschema/migrations
目录下的.edgeql
文件。
示例代码
以下是一个使用edgeql_codegen
的示例:
import 'package:edgedb/edgedb.dart';
import 'getMoviesStarring.edgeql.dart';
void main() async {
// 创建一个新的客户端
final client = createClient();
// 执行查询获取由某个演员主演的电影
final movies = await client.getMoviesStarring(name: 'Ben Kingsley');
// 遍历结果并打印
for (var movie in movies) {
print('Title: ${movie.title}\n'
'Release Year: ${movie.release_year}\n'
'Cast:\n${movie.actors.map((actor) {
return ' ${actor.$character_name}: ${actor.name}';
}).join('\n')}\n');
}
// 关闭客户端连接
await client.close();
}
更多关于Flutter数据库连接插件edgedb的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据库连接插件edgedb的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中连接并使用EdgeDB数据库可以通过一个自定义的插件或者第三方库来实现。然而,由于EdgeDB是一个相对较新的数据库系统,可能还没有现成的Flutter插件直接支持。不过,你可以通过调用原生代码(如Dart的ffi
包或者通过平台通道与原生Android/iOS代码交互)来实现与EdgeDB的连接。
以下是一个简化的示例,展示了如何通过平台通道在Flutter中调用原生代码来与EdgeDB进行交互。注意,这只是一个概念验证,并非完整的解决方案,因为实际实现会涉及到更多的细节和错误处理。
原生Android代码
首先,你需要在Android项目中添加EdgeDB的Java客户端库。由于EdgeDB的Java客户端可能不是现成的,这里假设你已经有了相应的库或者通过其他方式(如JNI调用C++客户端)实现了与EdgeDB的交互。
// MainActivity.java
package com.example.edgedbflutter;
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "com.example.edgedbflutter/channel";
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
super.configureFlutterEngine(flutterEngine);
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
.setMethodCallHandler(
(call, result) -> {
if (call.method.equals("queryEdgeDB")) {
String query = call.argument("query");
// 假设你有一个EdgeDBClient类来处理数据库连接和查询
EdgeDBClient client = new EdgeDBClient("your_database_dsn");
String resultFromDB = client.executeQuery(query);
// 将结果返回给Flutter
result.success(resultFromDB);
} else {
result.notImplemented();
}
}
);
}
}
// EdgeDBClient.java (假设的实现)
package com.example.edgedbflutter;
public class EdgeDBClient {
private String dsn;
public EdgeDBClient(String dsn) {
this.dsn = dsn;
// 初始化数据库连接(这里省略具体实现)
}
public String executeQuery(String query) {
// 执行查询并返回结果(这里省略具体实现)
// 假设返回查询结果的字符串表示
return "Query result from EdgeDB";
}
}
原生iOS代码
对于iOS,你需要使用Swift或Objective-C来实现与EdgeDB的交互,并通过Flutter的平台通道返回结果。同样地,这里假设你已经有了EdgeDB的iOS客户端或者通过其他方式实现了与EdgeDB的交互。
// AppDelegate.swift
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let channel = FlutterMethodChannel(name: "com.example.edgedbflutter/channel", binaryMessenger: controller.binaryMessenger)
channel.setMethodCallHandler {
(call: FlutterMethodCall, result: @escaping FlutterResult) in
if call.method == "queryEdgeDB" {
let query = call.arguments as! String
let resultFromDB = queryEdgeDB(query: query)
result(resultFromDB)
} else {
result(FlutterMethodNotImplemented)
}
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
func queryEdgeDB(query: String) -> String {
// 假设你有一个EdgeDB的iOS客户端来处理数据库连接和查询
// 这里省略具体实现,直接返回模拟结果
return "Query result from EdgeDB"
}
Flutter代码
在Flutter端,你可以通过MethodChannel
与原生代码进行交互。
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
static const platform = MethodChannel('com.example.edgedbflutter/channel');
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('EdgeDB Flutter Example'),
),
body: Center(
child: ElevatedButton(
onPressed: _queryDatabase,
child: Text('Query EdgeDB'),
),
),
),
);
}
Future<void> _queryDatabase() async {
try {
final String result = await platform.invokeMethod('queryEdgeDB', <String, dynamic>{'query': 'SELECT 1;'});
print(result); // 打印从数据库获取的结果
} on PlatformException catch (e) {
print("Failed to invoke: '${e.message}'.");
}
}
}
这个示例展示了如何通过平台通道在Flutter应用中调用原生代码来与EdgeDB进行交互。实际实现中,你需要根据EdgeDB的客户端库来完善原生代码部分,并确保数据库连接和查询的正确性。