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
英文地址,請注明出處:http://en.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 …