D1 与大多数 SQLite 的 SQL 约定兼容,因为它利用了 SQLite 的查询引擎。D1 支持许多数据库级语句,这些语句允许您列出表、索引并检查给定表或索引的架构。
您可以通过 Cloudflare 仪表板中的 D1 控制台wrangler d1 execute或使用D1 Worker Bindings API执行这些语句中的任何一个。
D1 支持 SQLite 扩展的子集以增加功能,其中包括:
- 默认 SQLite 扩展。
- FTS5 模块↗用于全文搜索。
D1 支持一些SQLite PRAGMA ↗语句。PRAGMA 语句是 SQLite 的 SQL 扩展。PRAGMA 命令可用于:
- 修改某些 SQLite 操作的行为。
- 查询 SQLite 库以获取有关模式或表的内部数据(但请注意,PRAGMA 语句不能查询表的内容)。
- 控制环境变量。
本页上的 PRAGMA 语句示例使用以下 SQL。
PRAGMA foreign_keys=off;DROP TABLE IF EXISTS "Employee";DROP TABLE IF EXISTS "Category";DROP TABLE IF EXISTS "Customer";DROP TABLE IF EXISTS "Shipper";DROP TABLE IF EXISTS "Supplier";DROP TABLE IF EXISTS "Order";DROP TABLE IF EXISTS "Product";DROP TABLE IF EXISTS "OrderDetail";DROP TABLE IF EXISTS "CustomerCustomerDemo";DROP TABLE IF EXISTS "CustomerDemographic";DROP TABLE IF EXISTS "Region";DROP TABLE IF EXISTS "Territory";DROP TABLE IF EXISTS "EmployeeTerritory";DROP VIEW IF EXISTS [ProductDetails_V];CREATE TABLE IF NOT EXISTS "Employee" ( "Id" INTEGER PRIMARY KEY, "LastName" VARCHAR(8000) NULL, "FirstName" VARCHAR(8000) NULL, "Title" VARCHAR(8000) NULL, "TitleOfCourtesy" VARCHAR(8000) NULL, "BirthDate" VARCHAR(8000) NULL, "HireDate" VARCHAR(8000) NULL, "Address" VARCHAR(8000) NULL, "City" VARCHAR(8000) NULL, "Region" VARCHAR(8000) NULL, "PostalCode" VARCHAR(8000) NULL, "Country" VARCHAR(8000) NULL, "HomePhone" VARCHAR(8000) NULL, "Extension" VARCHAR(8000) NULL, "Photo" BLOB NULL, "Notes" VARCHAR(8000) NULL, "ReportsTo" INTEGER NULL, "PhotoPath" VARCHAR(8000) NULL);CREATE TABLE IF NOT EXISTS "Category" ( "Id" INTEGER PRIMARY KEY, "CategoryName" VARCHAR(8000) NULL, "Description" VARCHAR(8000) NULL);CREATE TABLE IF NOT EXISTS "Customer" ( "Id" VARCHAR(8000) PRIMARY KEY, "CompanyName" VARCHAR(8000) NULL, "ContactName" VARCHAR(8000) NULL, "ContactTitle" VARCHAR(8000) NULL, "Address" VARCHAR(8000) NULL, "City" VARCHAR(8000) NULL, "Region" VARCHAR(8000) NULL, "PostalCode" VARCHAR(8000) NULL, "Country" VARCHAR(8000) NULL, "Phone" VARCHAR(8000) NULL, "Fax" VARCHAR(8000) NULL);CREATE TABLE IF NOT EXISTS "Shipper" ( "Id" INTEGER PRIMARY KEY, "CompanyName" VARCHAR(8000) NULL, "Phone" VARCHAR(8000) NULL);CREATE TABLE IF NOT EXISTS "Supplier" ( "Id" INTEGER PRIMARY KEY, "CompanyName" VARCHAR(8000) NULL, "ContactName" VARCHAR(8000) NULL, "ContactTitle" VARCHAR(8000) NULL, "Address" VARCHAR(8000) NULL, "City" VARCHAR(8000) NULL, "Region" VARCHAR(8000) NULL, "PostalCode" VARCHAR(8000) NULL, "Country" VARCHAR(8000) NULL, "Phone" VARCHAR(8000) NULL, "Fax" VARCHAR(8000) NULL, "HomePage" VARCHAR(8000) NULL);CREATE TABLE IF NOT EXISTS "Order" ( "Id" INTEGER PRIMARY KEY, "CustomerId" VARCHAR(8000) NULL, "EmployeeId" INTEGER NOT NULL, "OrderDate" VARCHAR(8000) NULL, "RequiredDate" VARCHAR(8000) NULL, "ShippedDate" VARCHAR(8000) NULL, "ShipVia" INTEGER NULL, "Freight" DECIMAL NOT NULL, "ShipName" VARCHAR(8000) NULL, "ShipAddress" VARCHAR(8000) NULL, "ShipCity" VARCHAR(8000) NULL, "ShipRegion" VARCHAR(8000) NULL, "ShipPostalCode" VARCHAR(8000) NULL, "ShipCountry" VARCHAR(8000) NULL);CREATE TABLE IF NOT EXISTS "Product" ( "Id" INTEGER PRIMARY KEY, "ProductName" VARCHAR(8000) NULL, "SupplierId" INTEGER NOT NULL, "CategoryId" INTEGER NOT NULL, "QuantityPerUnit" VARCHAR(8000) NULL, "UnitPrice" DECIMAL NOT NULL, "UnitsInStock" INTEGER NOT NULL, "UnitsOnOrder" INTEGER NOT NULL, "ReorderLevel" INTEGER NOT NULL, "Discontinued" INTEGER NOT NULL);CREATE TABLE IF NOT EXISTS "OrderDetail" ( "Id" VARCHAR(8000) PRIMARY KEY, "OrderId" INTEGER NOT NULL, "ProductId" INTEGER NOT NULL, "UnitPrice" DECIMAL NOT NULL, "Quantity" INTEGER NOT NULL, "Discount" DOUBLE NOT NULL);CREATE TABLE IF NOT EXISTS "CustomerCustomerDemo" ( "Id" VARCHAR(8000) PRIMARY KEY, "CustomerTypeId" VARCHAR(8000) NULL);CREATE TABLE IF NOT EXISTS "CustomerDemographic" ( "Id" VARCHAR(8000) PRIMARY KEY, "CustomerDesc" VARCHAR(8000) NULL);CREATE TABLE IF NOT EXISTS "Region" ( "Id" INTEGER PRIMARY KEY, "RegionDescription" VARCHAR(8000) NULL);CREATE TABLE IF NOT EXISTS "Territory" ( "Id" VARCHAR(8000) PRIMARY KEY, "TerritoryDescription" VARCHAR(8000) NULL, "RegionId" INTEGER NOT NULL);CREATE TABLE IF NOT EXISTS "EmployeeTerritory" ( "Id" VARCHAR(8000) PRIMARY KEY, "EmployeeId" INTEGER NOT NULL, "TerritoryId" VARCHAR(8000) NULL);CREATE VIEW [ProductDetails_V] as select p.*, c.CategoryName, c.Description as [CategoryDescription], s.CompanyName as [SupplierName], s.Region as [SupplierRegion] from [Product] p join [Category] c on p.CategoryId = c.id join [Supplier] s on s.id = p.SupplierId;列出数据库中的表和视图。其中包括 D1 维护的系统表。
每个表占一行。每行包含:
Schema:表所在的架构(例如main或temp)name:表的名称type:对象的类型(table、view、shadow、之一virtual)ncol:表中的列数,包括生成列或隐藏列wr:1如果表是 WITHOUT ROWID 表,0否则strict:1如果表是 STRICT 表,0否则
示例PRAGMA table_list
显示给定的模式(列、类型、空值、默认值)TABLE_NAME。
指定表中的每一列占一行。每行包含:
cid:行标识符name:列的名称type:数据类型(如果提供),''否则notnull:1如果该列可以为 NULL,0否则dflt_value:该列的默认值pk:1如果该列是主键,0否则
示例PRAGMA table_info
类似于PRAGMA table_info(TABLE_NAME)但也包括生成的列。
示例PRAGMA table_xinfo
显示给定的索引TABLE_NAME。
与指定表关联的每个索引对应一行。每行包含:
seq:内部跟踪的序列号name:索引的名称unique:1如果索引是唯一的,0否则origin:索引的来源(c如果由语句创建CREATE INDEX,u如果由 UNIQUE 约束创建,pk如果由 PRIMARY KEY 约束创建)partial:1如果索引是部分索引,0否则
示例PRAGMA index_list
显示给定的索引列INDEX_NAME。
指定索引中的每个键列对应一行。每行包含:
seqno:索引中列的排名cid:被索引的表中列的排名name:被索引的列的名称
示例PRAGMA index_info
类似PRAGMA index_info("TABLE_NAME")但也包括隐藏列。
示例PRAGMA index_xinfo
检查表的格式和一致性,包括:
- 格式错误的记录
- 缺页
- 数据库中多次使用或根本不使用的部分。
- 如果没有错误:一行,其值为
OK - 如果有错误:描述检查标记的问题的字符串
示例PRAGMA quick_check
检查选定表中外键的无效引用。
列出选定表中的外键约束。
切换 LIKE 运算符的大小写敏感性。PRAGMA case_sensitive_like设置为:
ON:'a' LIKE 'A' 为假OFF:'a' LIKE 'A' 为真(这是 LIKE 运算符的默认行为)
切换 CHECK 约束的执行。当PRAGMA ignore_check_constraints设置为:
ON:检查约束被忽略OFF:强制执行检查约束(这是默认行为)
在旧版 SQLite (3.24.0) 之前/之后切换 ALTER TABLE RENAME 命令行为。PRAGMA legacy_alter_table设置为:
ON:ALTER TABLE RENAME 仅重写其 CREATE TABLE 语句以及任何关联的 CREATE INDEX 和 CREATE TRIGGER 语句中表名的初始出现。所有其他出现均不作修改。OFF:ALTER TABLE RENAME 重写对模式中表名的所有引用(这是默认行为)。
切换递归触发功能。PRAGMA recursive_triggers设置为以下值时:
ON:触发后可激活其他触发器的触发器(单个触发器可在同一行上触发多次)OFF:触发的触发器无法激活其他触发器
切换不带 ORDER BY 子句的 SELECT 语句的结果顺序。当PRAGMA reverse_unordered_selects设置为:
ON:反转 SELECT 语句结果的顺序OFF:按通常顺序返回 SELECT 语句的结果
切换外键约束执行。PRAGMA foreign_keys设置为时:
ON:停止违反外键约束的操作OFF:允许违反外键约束的操作
允许您将外键约束的执行推迟到当前事务结束。这在数据库迁移期间非常有用,因为架构更改可能会暂时违反约束,具体取决于应用约束的顺序。
这不会禁用当前事务之外的外键强制执行。如果您在事务结束时尚未解决未解决的外键违规问题,则它将失败并出现FOREIGN KEY constraint failed错误。
请注意,设置PRAGMA defer_foreign_keys = ON不会阻止ON DELETE CASCADE操作的执行。虽然外键约束检查被推迟到事务结束时,但ON DELETE CASCADE操作仍将保持活动状态,这与 SQLite 的行为一致。
要推迟外键执行,请PRAGMA defer_foreign_keys = on在事务开始时或在违反约束的更改之前进行设置:
-- Defer foreign key enforcement in this transaction.PRAGMA defer_foreign_keys = on-- Run your CREATE TABLE or ALTER TABLE / COLUMN statementsALTER TABLE users ...
-- This is implicit if not set by the end of the transaction.PRAGMA defer_foreign_keys = off请参阅外键文档以了解有关如何使用外键的更多信息。
ANALYZE如果有必要,尝试通过对每个表运行命令来优化数据库中的所有架构。ANALYZE更新包含有关表和索引的统计信息的内部表。这些统计信息可帮助查询规划器更有效地执行输入查询。
PRAGMA optimize运行时ANALYZE,它会设置一个限制以确保命令不会花费太长时间执行。或者,PRAGMA optimize可能会认为没有必要运行ANALYZE(例如,如果架构没有发生重大变化)。在这种情况下,不会进行任何优化。
我们建议在对架构进行任何更改后(例如,创建索引后)运行此命令。
有关如何优化数据库的更多信息,请参阅SQLite PRAGMA 优化文档↗ 。PRAGMA optimize
您还可以查询sqlite_master表以显示所有表、索引以及用于生成它们的原始 SQL:
SELECT name, sql FROM sqlite_master { "name": "users", "sql": "CREATE TABLE users ( user_id INTEGER PRIMARY KEY, email_address TEXT, created_at INTEGER, deleted INTEGER, settings TEXT)" }, { "name": "idx_ordered_users", "sql": "CREATE INDEX idx_ordered_users ON users(created_at DESC)" }, { "name": "Order", "sql": "CREATE TABLE \"Order\" ( \"Id\" INTEGER PRIMARY KEY, \"CustomerId\" VARCHAR(8000) NULL, \"EmployeeId\" INTEGER NOT NULL, \"OrderDate\" VARCHAR(8000) NULL, \"RequiredDate\" VARCHAR(8000) NULL, \"ShippedDate\" VARCHAR(8000) NULL, \"ShipVia\" INTEGER NULL, \"Freight\" DECIMAL NOT NULL, \"ShipName\" VARCHAR(8000) NULL, \"ShipAddress\" VARCHAR(8000) NULL, \"ShipCity\" VARCHAR(8000) NULL, \"ShipRegion\" VARCHAR(8000) NULL, \"ShipPostalCode\" VARCHAR(8000) NULL, \"ShipCountry\" VARCHAR(8000) NULL)" }, { "name": "Product", "sql": "CREATE TABLE \"Product\" ( \"Id\" INTEGER PRIMARY KEY, \"ProductName\" VARCHAR(8000) NULL, \"SupplierId\" INTEGER NOT NULL, \"CategoryId\" INTEGER NOT NULL, \"QuantityPerUnit\" VARCHAR(8000) NULL, \"UnitPrice\" DECIMAL NOT NULL, \"UnitsInStock\" INTEGER NOT NULL, \"UnitsOnOrder\" INTEGER NOT NULL, \"ReorderLevel\" INTEGER NOT NULL, \"Discontinued\" INTEGER NOT NULL)" }您可以使用 SQL 运算符执行搜索LIKE:
const { results } = await env.DB.prepare( "SELECT * FROM Customers WHERE CompanyName LIKE ?",) .bind("%eve%") .all();console.log("results: ", results);results: [...]- 了解如何在 D1 中创建索引。
- 使用D1的JSON函数查询JSON数据。
- 用于
wrangler dev在本地运行您的 Worker 和 D1 并在部署之前调试问题。
「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」
(๑>ڡ<)☆谢谢老板~
使用微信扫描二维码完成支付
暂时无法评论哦~
暂无评论