Flutter——数据库Drift开发详细教程(八)

目录

  • 自定义 SQL 类型
  • 定义类型
  • 使用自定义类型
    • 在 Dart 中
    • 在 SQL 中
  • 方言意识
  • 支持的 SQLite 扩展
    • json1
    • fts5
    • 地缘垄断

自定义 SQL 类型

Drift 的核心库主要以 SQLite3 为目标平台编写。这体现在Drift 开箱即用的SQL 类型上——这些类型由 SQLite3 支持,并新增了一些由 Dart 处理的类型。

其他 Drift 支持有限的数据库通常支持更多类型。例如,Postgres 为持续时间、JSON 值、UUID 等提供专用类型。对于 sqlite3 数据库,您需要使用类型转换器 将这些值存储为 sqlite3 支持的类型。虽然类型转换器在这里也可以使用,但它们会指示 Drift 在后台使用常规文本列。例如,当数据库内置对 UUID 的支持时,这可能会导致语句效率降低,或与其他与同一数据库通信的应用程序出现问题。因此,Drift 允许使用“自定义类型”——未在核心drift包中定义且并非适用于所有数据库的类型。

何时使用自定义类型 - 摘要

当将漂移支持扩展到具有尚未被漂移覆盖的自身类型的新数据库引擎时,自定义类型是一个很好的工具。

除非您要扩展 Drift 以使用新的数据库包(这很棒,请联系我们!),否则您可能不需要自己实现自定义类型。像 Drift 这样的包drift_postgres已经为您定义了相关的自定义类型。

定义类型

举个例子,假设我们有一个数据库,它原生支持Duration 通过interval类型传递值。我们使用的数据库驱动程序也原生支持Duration值,这意味着值可以通过预处理语句传递给数据库,也可以从行中读取,而无需手动转换。

Duration在这种情况下,将添加一个自定义类型类来实现对漂移的支持:

import 'package:drift/drift.dart';class DurationType implements CustomSqlType<Duration> {const DurationType();String mapToSqlLiteral(Duration dartValue) {return "interval '${dartValue.inMicroseconds} microseconds'";}Object mapToSqlParameter(Duration dartValue) => dartValue;Duration read(Object fromSql) => fromSql as Duration;String sqlTypeName(GenerationContext context) => 'interval';
}

此类型定义以下内容:

  • 当Duration值映射到 SQL 文字时(例如,因为它们在Constants 中使用),我们interval '123754
    microseconds’以 SQL 的方式表示它们。
  • 当一个Duration值映射到一个参数时,我们直接使用该值(因为我们假设它受底层数据库驱动程序支持)。
  • 类似地,我们希望数据库驱动程序正确地将持续时间作为的实例返回 Duration,因此反过来read也只是转换值。
  • CREATE TABLE在语句和强制类型转换中使用的名称是interval。

使用自定义类型

在 Dart 中

要在 Dart 表上定义自定义类型,请使用customType具有以下类型的列构建器方法:

import 'package:drift/drift.dart';
import 'type.dart';class PeriodicReminders extends Table {IntColumn get id => integer().autoIncrement()();Column<Duration> get frequency => customType(const DurationType()).clientDefault(() => Duration(minutes: 15))();TextColumn get reminder => text()();
}

如示例所示,其他列约束clientDefault仍然可以添加到自定义列中。如果需要,您甚至可以组合自定义列和类型转换器。

这足以使大多数查询正常工作,但在某些高级场景中,您可能需要提供更多信息才能使用自定义类型。例如,当手动构造一个Variable或一个Constant带有自定义类型的 a 时,必须将自定义类型作为第二个参数添加到构造函数中。这是因为与内置类型不同,drift 没有一个中央寄存器来描述如何处理自定义类型值。

在 SQL 中

在 SQL 中,Drift 的内联 Dart语法可用于定义自定义类型:

import 'type.dart';CREATE TABLE periodic_reminders (id INTEGER NOT NULL PRIMARY KEY,frequency `const DurationType()` NOT NULL,reminder TEXT NOT NULL
);

请注意,漂移文件中对自定义类型的支持目前有限。例如,CAST表达式中目前不支持自定义类型。如果您对自定义类型的高级分析支持感兴趣,请提交问题或参与讨论,并描述您的用例,谢谢!

方言意识

当为某些数据库管理系统仅支持的 SQL 类型定义自定义类型时,您的数据库将仅适用于这些数据库系统。例如,任何使用DurationType 上述定义的表都无法与 sqlite3 兼容,因为它使用的interval类型被 sqlite3 解释为整数——而interval xyz microsecondssqlite3 根本不支持该语法。

从 Drift 2.15 开始,可以根据所使用的方言定义不同行为的自定义类型。这可以用来为其他数据库系统构建 polyfill。首先,考虑一个将持续时间存储为整数的自定义类型,类似于类型转换器可能执行的操作:

class _FallbackDurationType implements CustomSqlType<Duration> {const _FallbackDurationType();String mapToSqlLiteral(Duration dartValue) {return dartValue.inMicroseconds.toString();}Object mapToSqlParameter(Duration dartValue) {return dartValue.inMicroseconds;}Duration read(Object fromSql) {return Duration(microseconds: fromSql as int);}String sqlTypeName(GenerationContext context) {return 'integer';}
}const durationType = DialectAwareSqlType<Duration>.via(fallback: _FallbackDurationType(),overrides: {SqlDialect.postgres: DurationType(),},
);

通过使用DialectAwareSqlType,您可以在 PostgreSQL 数据库上自动使用该interval类型,同时在 sqlite3 和其他数据库上回退到整数类型:

  Column<Duration> get frequency => customType(durationType).clientDefault(() => Duration(minutes: 15))();

支持的 SQLite 扩展

在分析.drift文件时,生成器会考虑可能存在的 sqlite3 扩展。但是,生成器无法识别数据库正在使用的 sqlite3 库,因此它会默认使用未启用任何扩展的旧版 sqlite3 库,并做出悲观的假设。使用类似 的包时,您将获得启用了 json1 和 fts5 扩展的最新 sqlite3 版本。您可以使用构建选项sqlite3_flutter_libs将此信息告知生成器。

json1

要在漂移文件和编译查询中启用 json1 扩展,请修改 构建选项以包含 json1在该sqlite_module部分中。

SQLite 扩展程序不需要任何特殊表,并且适用于所有文本列。在漂移文件和编译查询中,json启用该扩展程序后,所有函数均可用。

由于 json 扩展是可选的,因此在 Dart 中启用它需要特殊的导入。 package:drift/extensions/json1.dart下面是一个在 Dart 中使用 json 函数的示例:

import 'package:drift/drift.dart';
import 'package:drift/extensions/json1.dart';class Contacts extends Table {IntColumn get id => integer().autoIncrement()();TextColumn get data => text()();
}(tables: [Contacts])
class Database extends _$Database {// constructor and schemaVersion omitted for brevityFuture<List<Contacts>> findContactsWithNumber(String number) {return (select(contacts)..where((row) {// assume the phone number is stored in a json key in the `data` columnfinal phoneNumber = row.data.jsonExtract<String, StringType>('phone_number');return phoneNumber.equals(number);})).get();}
}

您可以在sqlite.org上了解有关 json1 扩展的更多信息。

fts5

fts5 扩展提供了 SQLite 表中的全文搜索功能。要在漂移文件和编译查询中启用 fts5 扩展,请修改 构建选项以包含 fts5在该sqlite_module部分中。

就像您在使用 sqlite 时所期望的那样,您可以使用CREATE VIRTUAL TABLE语句在漂移文件中创建 fts5 表。

CREATE VIRTUAL TABLE email USING fts5(sender, title, body);

fts5 表上的查询按预期工作:

emailsWithFts5: SELECT * FROM email WHERE email MATCH 'fts5' ORDER BY rank;

fts5 中的bm25、highlight和snippet函数也可用于自定义查询。

在 Dart 中无法声明 fts5 表或在 fts5 表上进行查询。您可以在sqlite.org上了解有关 fts5 扩展的更多信息。

地缘垄断

Geopoly 模块是R-Tree扩展的替代接口,它使用GeoJSON表示法 ( RFC-7946 ) 来描述二维多边形。Geopoly 包含以下函数:检测一个多边形是否包含于另一个多边形内或与另一个多边形重叠;计算多边形的封闭面积;对多边形进行线性变换;将多边形渲染为SVG 格式;以及其他类似的操作。

要geopoly在漂移文件和编译查询中启用扩展,请修改 构建选项以包含 geopoly在该sqlite_module部分中。

使用此扩展创建虚拟表的示例:

create virtual table geo using geopoly(geoID, a, b);

SQLite 会接受附加列(如上例中的geoID、a、 )中的任何类型,因此会为这些列生成一个类型,这并不总是很方便。为了避免这种情况,您可以像以下示例一样添加类型: bdriftDriftAny

create virtual table geo using geopoly (geoID INTEGER not null,a INTEGER,b
);

这将为列类型添加提示,然后 Dart 代码将更方便使用
您可以在sqlite.org上了解有关 geopoly 扩展的更多信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85081.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓远控工具 CRaxsRat v7.6 安装与使用教程(仅供合法测试学习)

在当今的信息安全领域&#xff0c;移动设备已成为重点关注对象。本文将介绍一款用于远程管理与教学研究的工具 —— CRaxsRat v7.6&#xff0c;并详细讲解其安装与使用流程。本教程仅供网络安全爱好者在合法授权环境下学习使用&#xff0c;严禁任何非法用途。 &#x1f50d; 一…

容器的本质是进程

前言 Linux 容器的本质&#xff0c;是一个被隔离和限制的进程。 与虚拟机不同&#xff0c;容器无需虚拟化一个完整的操作系统&#xff0c;所以它比虚拟机更轻量级&#xff0c;效率也更高。 Linux 容器通过 namespaces 技术来隔离容器的视图&#xff0c;使得容器进程只能看到…

LeetCode 第75题:颜色分类

给定一个包含红色、白色和蓝色、共n个元素的数组nums&#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排序。 使用整数0、1和2分布表示红色、白色和蓝色。 必须在不使用库内置sort函数的情况下解决这个问题。 示例1&a…

PHP基础-函数

函数是一段可重复使用的代码块&#xff0c;可以将一系列操作封装起来&#xff0c;使代码更加模块化、可维护和可重用&#xff0c;来大大节省我们的开发时间和代码量&#xff0c;提高编程效率。在PHP中你可以使用&#xff1a; 内置函数&#xff08;如 strlen()、array_merge()&a…

【FastAPI高级实战】结合查询参数与SQLModel Joins实现高效多表查询(分页、过滤、计数)

想象一下&#xff0c;你正在开发一个超酷的Web应用&#xff0c;比如一个博客平台或者一个在线商店。你的API不仅要能把数据&#xff08;比如文章列表、商品信息&#xff09;展示给用户&#xff0c;更要聪明到能理解用户的各种“小心思”&#xff1a;用户可能想看最新的文章、搜…

华为OD-2024年E卷-通过软盘拷贝文件[200分] -- python

问题描述&#xff1a; 有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究。但此电脑除了有一个3.5寸软盘驱动器以外&#xff0c;没有任何手段可以将文件持贝出来&#xff0c;而且只有一张软盘可以使用。因此这一张软盘是唯一可以用来拷贝文件的载体。科学家想要…

Keepalived 高可用,nginx + keepalived , lvs + keepalived、 数据库+keepalived

keepalived 官网 Keepalived 可以用来防止服务器单点故障的发生 # 原理 是基于VRRP协议实现的&#xff0c;当backup收不到vrrp包时&#xff0c;就认为master宕机了&#xff0c;这时就需要根据VRRP的优先级来选举一个backup 当master&#xff0c;就实现服务的HA&#xff08;高…

开疆智能Devicenet转ModbusTCP网关连接台达从站通讯模块配置案例

本案例是通过开疆智能Devicenet转ModbusTCP网关连接台达Devicenet从站通讯模块DVPDT02-H2的配置案例&#xff0c;网关作为ModbusTCP服务器和Devicenet主站&#xff0c;连接台达Devicenet从站&#xff0c; 配置过程&#xff1a; 首先配置Devicenet从站&#xff0c;先设置从站De…

网络NAT是什么

网络NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是一种用于计算机网络中的技术&#xff0c;主要目的是在私有网络与公有网络&#xff08;比如互联网&#xff09;之间转换IP地址&#xff0c;实现私有网络中的多台设备通过一个公网IP访问外…

React状态管理——react-redux

目录 一、redux介绍 二、安装 三、基本实现步骤 3.1 创建Action Types 3.2 创建counterAction 3.3 创建counterReducer 3.4 结合所有Reducer 3.5 创建store 3.6 入口文件中提供store 3.7 在组件中的使用 3.8 使用thunk实现异步支持 3.8.1 安装 3.8.2 在counterAct…

Java 零工市场小程序 | 灵活就业平台 | 智能匹配 | 日结薪系统 | 用工一站式解决方案

在就业形势如此严峻的情况下&#xff0c;很多小伙伴都会选择零工的工作方式来赚取外快&#xff0c;很多用人单位也会因为职为短暂空缺或是暂时人手不够而选择招用兼职人员。 而Java 作为企业级开发的主流语言&#xff0c;以其卓越的性能和稳定性著称。把零工的需求&#xff08…

数据可视化——一图胜千言

第04篇&#xff1a;数据可视化——一图胜千言 写在前面&#xff1a;大家好&#xff0c;我是蓝皮怪&#xff01;前面几篇我们聊了统计学的基本概念、数据类型和描述性统计&#xff0c;这一篇我们要聊聊数据分析中最直观、最有趣的部分——数据可视化。你有没有发现&#xff0c;很…

1.1 Linux 编译FFmpeg 4.4.1

一、安装编译工具 sudo apt install -y autoconf automake build-essential cmake git pkg-config nasm yasm libtool zlib1g-dev说明&#xff1a; autoconf&#xff1a;生成 configure 脚本&#xff0c;用于自动配置源码。automake&#xff1a;与 autoconf 配合&#xff0c;…

【图片识别改名】如何批量识别大量图片的文字并重命名图片,基于WPF和京东OCR识别接口的实现方案

应用场景 在企业文档管理、数字图书馆、电商商品管理等场景中&#xff0c;经常需要处理大量图片中的文字信息。例如&#xff1a; 电商平台需要将商品图片中的型号、规格等信息提取出来作为文件名图书馆需要将扫描的图书页面识别为文字并整理归档企业需要将纸质文档电子化并按…

简历模板2——数据挖掘工程师5年经验

姓名 / Your Name 数据挖掘工程师 | 5年经验 | 推荐/风控/图模型 &#x1f4de; 138-XXXX-XXXX | ✉️ your.emailexample.com | &#x1f310; github.com/yourname | &#x1f4cd; 北京 &#x1f3af; 个人简介 / Summary 5年大厂数据挖掘经验&#xff0c;硕士学历。擅长推…

CSS3 渐变效果

1. 引言 CSS3 渐变能够在指定颜色之间创建平滑过渡效果。这种设计元素不仅能为网页增添丰富的视觉层次&#xff0c;更是现代网页设计的重要组成部分。CSS3 提供两种主要的渐变类型&#xff1a;线性渐变(Linear Gradient) - 沿直线方向进行颜色过渡&#xff1b;径向渐变(Radial…

A Survey on 3D Gaussian Splatting——3D高斯领域综述

原文链接&#xff1a;[2401.03890] A Survey on 3D Gaussian Splatting 动态更新的GitHub仓库&#xff08;包含性能对比与最新文献追踪&#xff09;&#xff1a; https://github.com/guikunchen/3DGS-Benchmarks https://github.com/guikunchen/Awesome3DGS 摘要&#xff1…

计算机网络 期末实训 eNSP 校园网

eNSP 综合实训 小型校园网 计算机网络期末实训 01 搭建拓扑 1.设计任务 构建一个小型校园网络,涵盖以下设备与区域: 学生宿舍区:50台计算机办公楼区:30台计算机(细分为财务部门、人事部门及其他科室)图书馆:10台计算机教学楼:30台计算机服务器集群:2台服务器,分别用…

Smart Form Adobe form 强制更改内表:TNAPR

强制更改内表:TNAPR se16-> Smart Form总览 Smart form 变量格式说明: &symbol& (括号中,小写字母为变量) &symbol& 屏蔽从第一位开始的N位 &symbol (n)& 只显示前N位 &symbol (S)& 忽略正负号 &symbol (<)& 符号在…

页面配置文件pages.json和小程序配置

页面配置文件pages.json和小程序配置 pages.jsonpagesstyle-navigationBarBackgroundColorstyle-navigationBarTitleTextstyle-navigationStylestyle-enablePullDownRefresh注意事项不同平台区分配置新建页面 globalStyletabBar代码 manifest.json授权web配置代理 pages.json …