Community编程与开发github.com

postgresql-docs

PostgreSQL 18 文档中的陷阱、令人惊讶的默认值、变更以及推荐模式,每条规则均附有 postgresql.org 的官方链接。用于编写或审查 PostgreSQL SQL、模式设计、迁移、ALTER TABLE 锁、索引、事务、隔离级别和重试、锁定、Upsert 和 MERGE、COPY、JSONB、timestamptz、生成列和标识列、分区、EXPLAIN、VACUUM、角色、行级安全、PL/pgSQL、全文搜索、连接设置以及升级到 PostgreSQL 18 等场景。

postgresql-docs 是什么?

该技能为 AI 智能体提供了权威的 PostgreSQL 18 知识,重点涵盖模型容易出错的领域,例如令人惊讶的默认行为、并发控制和迁移陷阱。它包含了 27 条快速规则,每条都链接到官方 PostgreSQL 18 文档,确保信息高度准确。此外,它还提供了指向详细参考文件的主题导航表,涵盖了模式设计、迁移、数据类型、JSON、查询、写入、索引、并发、性能、安全性和 PL/pgSQL 等方面。最后,该技能还总结了 PostgreSQL 18 的关键变更和旧模式对比,帮助用户在编写 SQL、设计模式或规划升级时做出正确决策。该技能适用于所有基于 LLM 的编码助手(如 Claude Code、Cursor、Codex)以及任何需要 PostgreSQL 18 相关准确信息的场景。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/quentin-autret/claude-skills/tree/main/skills/postgresql-docs

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

PostgreSQL 文档

来自 PostgreSQL 18 文档的规则,这些规则是模型可能出错的地方:令人惊讶的默认值、锁和并发陷阱、PostgreSQL 18 变更以及文档推荐的模式。每条规则都以支持它的文档 URL 结尾。

覆盖版本

参考资料遵循 PostgreSQL 18 文档(次要版本 18.6)。仅在 18 版本中成立的事实用“PostgreSQL 18”标记。请先检查服务器版本。在较旧的服务器上,将每条“PostgreSQL 18”规则视为不可用。

如何导航

仅从下面的表格中阅读任务所需的参考资料。来源:SOURCES.md。

快速规则

  1. 在 PostgreSQL 18 中,没有关键字生成的列是 VIRTUAL(计算型)的,在读取时计算。对于统计信息或逻辑复制,请写入 STORED。 https://www.postgresql.org/docs/18/ddl-generated-columns.html https://www.postgresql.org/docs/18/sql-altertable.html
  2. 使用标识列,而不是 serial。标识列是 NOT NULL 但不是唯一的:请添加 PRIMARY KEY。 https://www.postgresql.org/docs/18/ddl-identity-columns.html
  3. 自行索引每个外键的引用列。PostgreSQL 仅索引被引用的一侧。 https://www.postgresql.org/docs/18/ddl-constraints.html
  4. 普通的 CREATE INDEX 会在整个构建过程中阻塞写入。在活动表上,在事务块外部使用 CREATE INDEX CONCURRENTLY,并在失败时删除它留下的 INVALID 索引。 https://www.postgresql.org/docs/18/sql-createindex.html
  5. 将大表的约束添加为 NOT VALID,然后 VALIDATE CONSTRAINT,这不会阻塞写入。PostgreSQL 18 也支持对 NOT NULL 使用此方法。 https://www.postgresql.org/docs/18/sql-altertable.html
  6. 使用 volatile 默认值、存储生成列或标识的 ADD COLUMN 会在 ACCESS EXCLUSIVE 锁下重写整个表。非 volatile 默认值则不会。 https://www.postgresql.org/docs/18/sql-altertable.html
  7. 在迁移会话中设置 lock_timeout,并按角色或会话设置 statement_timeout、lock_timeout 和 transaction_timeout,切勿全局设置。 https://www.postgresql.org/docs/18/runtime-config-client.html
  8. 使用 INSERT ... ON CONFLICT (cols) DO UPDATE 进行 Upsert,该操作在 READ COMMITTED 隔离级别下,在并发情况下始终执行插入或更新。当另一个会话插入相同键时,MERGE 可能因唯一约束违反而失败。 https://www.postgresql.org/docs/18/transaction-iso.html
  9. 在 SQLSTATE 为 40001 和 40P01 时重试整个事务。PostgreSQL 不会自动重试。请测试 SQLSTATE,而不是消息。 https://www.postgresql.org/docs/18/mvcc-serialization-failure-handling.html
  10. 默认隔离级别是 READ COMMITTED:每个语句都会看到一个新的快照。多行业务规则需要 SERIALIZABLE 或显式锁。 https://www.postgresql.org/docs/18/transaction-iso.html https://www.postgresql.org/docs/18/applevel-consistency.html
  11. 对于作业队列,使用 SELECT ... FOR UPDATE SKIP LOCKED,当键保持不变时,使用 FOR NO KEY UPDATE。 https://www.postgresql.org/docs/18/sql-select.html https://www.postgresql.org/docs/18/explicit-locking.html
  12. 列表中或子查询中包含 NULL 的 NOT IN 永远不会为 true。除了 count 之外的聚合函数在零行上返回 NULL。 https://www.postgresql.org/docs/18/functions-comparisons.html https://www.postgresql.org/docs/18/functions-aggregate.html
  13. 分页和 LIMIT 需要基于唯一键的 ORDER BY,否则不同运行的结果会不同。 https://www.postgresql.org/docs/18/queries-limit.html
  14. 将瞬间存储为 timestamptz。TIMESTAMP '2004-10-19 10:23:54+02' 是一个不带时区的时间戳,时区偏移量会被丢弃。 https://www.postgresql.org/docs/18/datatype-datetime.html
  15. now() 是事务开始时间。使用 clock_timestamp() 获取实时时间。切勿默认使用字符串 'now'。 https://www.postgresql.org/docs/18/functions-datetime.html
  16. 使用 jsonb,并用 GIN (col jsonb_path_ops) 为 @> 查询建立索引。操作符必须应用于索引表达式,索引才能被使用。 https://www.postgresql.org/docs/18/datatype-json.html
  17. PostgreSQL 18 新增了 uuidv7(),一个时间有序的 UUID,与 gen_random_uuid() 并列。 https://www.postgresql.org/docs/18/functions-uuid.html
  18. PostgreSQL 18 的 RETURNING 在 INSERT、UPDATE、DELETE 和 MERGE 中读取 old.col 和 new.col。 https://www.postgresql.org/docs/18/dml-returning.html
  19. EXPLAIN ANALYZE 会执行语句:在 BEGIN ... ROLLBACK 中包装写入操作。在 PostgreSQL 18 中,它自动包含 BUFFERS。 https://www.postgresql.org/docs/18/sql-explain.html https://www.postgresql.org/docs/18/using-explain.html
  20. 在 PostgreSQL 18 中,多列 B-tree 可以在没有前导列的情况下为查询提供服务(跳跃扫描),但仅当该列具有较少的不同值时。 https://www.postgresql.org/docs/18/indexes-multicolumn.html
  21. 保持 autovacuum 开启,并避免使用 VACUUM FULL。Autovacuum 永远不会分析分区表或临时表:自己对这些表执行 ANALYZE。 https://www.postgresql.org/docs/18/routine-vacuuming.html
  22. 在启用 ENABLE ROW LEVEL SECURITY 之前,行级安全不起作用,并且表所有者绕过它,除非设置了 FORCE ROW LEVEL SECURITY。 https://www.postgresql.org/docs/18/ddl-rowsecurity.html
  23. SECURITY DEFINER 函数需要在同一个事务中设置 SET search_path = trusted_schema, pg_temp 并从 PUBLIC 撤销 EXECUTE。 https://www.postgresql.org/docs/18/sql-createfunction.html
  24. 授予表的权限不会扩展到其使用的序列,包括 serial 列的序列。请单独设置序列权限。 https://www.postgresql.org/docs/18/sql-grant.html
  25. 客户端默认使用 sslmode=prefer,这不会验证服务器。请使用 sslmode=verify-full。 https://www.postgresql.org/docs/18/libpq-ssl.html
  26. 使用 format('%I', ident) 和 EXECUTE ... USING 构建动态 SQL 以处理值,切勿通过拼接。 https://www.postgresql.org/docs/18/plpgsql-statements.html
  27. 全文表达式索引必须使用双参数形式的 to_tsvector('english', col),并且查询必须重复该确切形式。 https://www.postgresql.org/docs/18/textsearch-tables.html

参考资料

参考文件阅读时机
schema-design.md创建表时:标识列和序列、生成列、约束、时间键、域、模式和 search_path、分区设计
migrations-and-locks.md编写迁移时:ALTER TABLE 锁级别和重写、NOT VALID、并发索引构建、REINDEX、分区附加和分离
data-types.md选择数值、文本、bytea、枚举、UUID、数组或范围类型、范围上的排除约束时
datetime.md处理时间戳、时区、间隔、extract、date_trunc、to_char、to_timestamp 的任何场景
json.md存储、查询、索引或更新 JSONB、jsonpath、JSON_VALUE、JSON_TABLE、JSON 聚合函数时
queries.mdSELECT 逻辑:NULL 语义、JOIN、LATERAL、分组、聚合、窗口函数、分页、UNION、CTE
writes.mdINSERT ON CONFLICT、UPDATE 和 DELETE 连接、批量处理大变更、RETURNING、MERGE、COPY、批量加载时
indexes.md选择或审查索引时:类型、列顺序、跳跃扫描、部分索引、表达式索引、INCLUDE、pattern_ops、GIN、BRIN
concurrency.md隔离级别、重试、行锁和表锁、死锁、咨询锁、超时、LISTEN 和 NOTIFY
performance.md阅读 EXPLAIN、统计信息和扩展统计信息、VACUUM、内存和规划器设置、并行查询、pg_stat_statements 时
security.mdGRANT 和默认权限、角色、行级安全、SECURITY DEFINER、密码、TLS 和 libpq 连接参数时
plpgsql-triggers.md编写函数、PL/pgSQL、动态 SQL、异常、触发器、存储过程时
text-search.md字符串函数、LIKE 和正则表达式、引用、使用 tsvector 的全文搜索、排序、ts_headline 时

升级 PostgreSQL 18 时需牢记的变更

旧模式

旧模式当前模式
默认值中的 'now' 或 'today' 字面量now()、CURRENT_DATE (https://www.postgresql.org/docs/18/datatype-datetime.html)
MD5 密码、password 认证方法scram-sha-256 (https://www.postgresql.org/docs/18/auth-password.html)

Individual skills in this repo

This repo contains 16 individual skills — each has its own dedicated page.

eslint-docs

Teaches current ESLint 10 practices drawn from the official documentation. Use when writing, reviewing or fixing an eslint.config.js (flat config, defineConfig, files, ignores, globalIgnores, extends, languageOptions, globals, parsers, processors), configuring ESLint rules and severities, disable comments and inline config, running the CLI in CI (--fix, --cache, --quiet, --max-warnings, bulk suppressions, formatters, feature flags, MCP server), writing custom rules (meta, schema, fixes, suggestions, selectors, scope, code paths) and testing them with RuleTester, building plugins, shareable configs, custom parsers, processors or formatters, using the Node.js API (ESLint, Linter), or migrating to ESLint 9 or 10 from eslintrc. Triggers on eslint, eslint.config.js, flat config, .eslintrc, .eslintignore, @eslint/js, js/recommended, eslint-disable, no-unused-vars, no-restricted-imports, no-restricted-syntax, RuleTester, eslint-plugin, eslint-config, FlatCompat, context.getScope is not a function, ESLint 10.

grafana-cloud-docs

Grafana Cloud pitfalls, defaults, limits and current patterns from the Grafana, Mimir, Loki and Tempo docs, each tied to its docs URL. Use when sending OpenTelemetry data to Grafana Cloud, writing PromQL, LogQL or TraceQL, controlling cardinality and cost, designing alert rules, routing notifications, provisioning alerting, building Synthetic Monitoring checks, using the /apis dashboard API, choosing access policy tokens or service accounts, or migrating off API keys, the Loki Exporter and legacy /api routes.

javascript-docs

Teaches current JavaScript (ECMAScript) practice drawn from the MDN JavaScript documentation. Use when writing, reviewing or fixing modern JavaScript, choosing a built-in API, or replacing a deprecated pattern. Covers equality and coercion, let/const and the temporal dead zone, strict mode, ASI, functions, classes and private fields, objects, prototypes, Proxy, Reflect, Symbol, eval, operators (??, ?., spread, BigInt arithmetic), statements, Promise, async/await, Promise.try, iterators and iterator helpers, generators, using/await using, DisposableStack, WeakRef, Array (toSorted, at, groupBy, fromAsync), Map, Set methods, WeakMap, strings and Unicode, encodeURIComponent, RegExp (v flag, RegExp.escape, lastIndex), Number, Math, BigInt, JSON (rawJSON, revivers), typed arrays, ArrayBuffer, base64, SharedArrayBuffer, Atomics, Temporal, Date, Intl (DateTimeFormat, NumberFormat, Collator, Segmenter, PluralRules), errors (cause, Error.isError), ES modules, import attributes, import.meta, dynamic import.

next-intl-docs

Teaches current next-intl 4 practices for internationalizing Next.js apps, drawn from the official documentation. Use when setting up next-intl with the App Router, writing i18n/request.ts, adding a [locale] segment with defineRouting, createMiddleware in proxy.ts (formerly middleware.ts), building locale switchers with createNavigation, translating with useTranslations or getTranslations, passing messages to NextIntlClientProvider, writing ICU messages (plurals, select, rich text), formatting dates, numbers and lists with useFormatter, translating metadata, Server Actions, Route Handlers, localized 404 and error pages, static rendering with next/root-params, type-safe messages through AppConfig, testing with Jest, Vitest, Storybook, or extracting inline messages with useExtracted. Triggers on next-intl, useTranslations, getTranslations, NextIntlClientProvider, getRequestConfig, i18n routing, locale prefix, localePrefix, NEXT_LOCALE, hreflang, setRequestLocale, ICU messages, App Router internationalization.

nodejs-docs

Teaches Node.js practice drawn from the official Node.js API documentation, with pitfalls, surprising defaults, deprecations and replacements, each backed by its nodejs.org URL. Use when writing, reviewing, debugging or upgrading Node.js code, or choosing a built-in module (fs, crypto, streams, http, process, CLI flags, node:test, ESM/CommonJS, package.json exports, TypeScript type stripping, child_process, worker_threads, node:sqlite, deprecations).

playwright-docs

Pitfalls, surprising defaults and recommended patterns of Playwright Test for JavaScript and TypeScript, distilled from the official docs. Use when writing, reviewing, debugging or configuring Playwright tests (@playwright/test, playwright.config.ts, npx playwright test), including flaky tests, locators (getByRole, filter, strict mode), web-first assertions (expect, toHaveText, toBeVisible, expect.poll, toPass), fixtures, storageState authentication, project dependencies, timeouts, retries, network mocking (page.route, routeFromHAR, routeWebSocket), API testing, clock, aria snapshots, toHaveScreenshot, axe accessibility scans, traces, UI mode, reporters, CI, Docker, sharding, test locks, component testing with stories and mount, codegen, Playwright MCP, playwright-cli and migration from Puppeteer, Protractor, Testing Library or older Playwright versions.

react-docs

Writes, reviews and upgrades React 19.3 code from the official react.dev documentation. Use when writing components and Hooks, removing unnecessary useEffect calls, fixing Effect dependencies with useEffectEvent, building forms with Actions (useActionState, useOptimistic, useFormStatus, form action), using Server Components, 'use client', 'use server' and Server Functions, Suspense, use(), useTransition, useDeferredValue, ViewTransition, Activity, adopting React Compiler and eslint-plugin-react-hooks, deciding on useMemo, useCallback and memo, server rendering and hydration (createRoot, hydrateRoot, renderToPipeableStream, prerender), or migrating from React 18 (forwardRef, Context.Provider, ReactDOM.render, propTypes, defaultProps). Triggers on React, JSX, hooks, useState, useEffect, useRef, useContext, Server Components, RSC, Actions, React Compiler, Strict Mode, hydration mismatch, React 19 upgrade.

rust-std-docs

Gives current guidance from the official Rust standard library docs (std 1.99.1 stable) on pitfalls, panics, platform differences, discouraged APIs and newer stable replacements. Use when writing, reviewing or refactoring Rust code that uses std, especially collections (Vec, HashMap, BTreeMap, BinaryHeap, entry, extract_if, sort), Option/Result/error handling (expect, ?, Error, ExitCode, panic), iterators (collect, flatten, Peekable, try_fold), Box/Rc/RefCell/Cow/Pin/mem::take, Arc/Mutex/RwLock/OnceLock/LazyLock/thread::scope/mpsc/Condvar/atomics, String/str/fmt/format!/OsString/CString, io/fs/path (BufWriter, OpenOptions, PathBuf::join), process/env/net/time (Command, set_var, TcpStream, Instant, Duration), From/TryFrom/AsRef/Ord/Drop/Deref/Clone, and unsafe raw pointers, MaybeUninit, transmute, NonNull or integer overflow and float ordering.

socketio-docs

Builds, configures and debugs Socket.IO 4.8 servers and clients from the official Socket.IO v4 documentation. Use when writing a Node.js Socket.IO server (Express, Fastify, Koa, Bun, uWebSockets.js) or a socket.io-client app, emitting events with acknowledgements, timeout() and emitWithAck, broadcasting to rooms and namespaces, authenticating in middleware with the auth option, configuring CORS, reverse proxies and sticky sessions, scaling with the Redis, Redis Streams, Postgres, MongoDB or Cluster adapter, enabling connection state recovery and delivery guarantees, tuning reconnection, writing tests, troubleshooting connection issues, or migrating from Socket.IO v2 or v3. Triggers on Socket.IO, socket.io, socket.io-client, io(), new Server, emit, emitWithAck, acknowledgements, rooms, namespaces, broadcast, io.use, middleware, CORS, Redis adapter, sticky sessions, connection state recovery, reconnection, connect_error, Session ID unknown. Not for plain WebSocket servers such as ws without Socket.IO.

tailwindcss-docs

Teaches current Tailwind CSS v4 practices drawn from the official documentation. Use for any task that touches Tailwind CSS v4, even a small one, because many v3 habits silently break in v4. Use when writing or reviewing Tailwind CSS v4 code (utility classes, variants, arbitrary values, theme variables in @theme, @utility, @custom-variant, @apply, @reference, @source), setting up Tailwind in a framework or build tool (Vite plugin, PostCSS plugin, CLI, Next.js, SvelteKit, Nuxt, Angular, Laravel, Rails), customizing the theme (colors, fonts, breakpoints, spacing, animations), building dark mode with a class or data attribute, or migrating a project from Tailwind v3 (tailwind.config.js, @tailwind directives, darkMode class, safelist, bg-opacity, renamed shadow and outline utilities). Triggers on tailwindcss, @import "tailwindcss", @tailwindcss/vite, @tailwindcss/postcss, @tailwindcss/cli, @theme, @custom-variant dark, npx @tailwindcss/upgrade, upgrade to Tailwind v4.

tauri-docs

Tauri 2 apps, tauri.conf.json, capabilities and permissions, commands and invoke, events and channels, plugins, bundling, signing and the updater, migration from Tauri 1. Guides Tauri 2 work from the official v2 documentation, including scopes, managed state, plugin authoring, CSP and the isolation pattern, testing and debugging, Linux, Windows and macOS packages, and mobile and store releases. Use when writing or reviewing a Tauri 2 app, adding a plugin or a capability, fixing a "not allowed" or "forbidden path" error, wiring IPC between Rust and the webview, packaging, signing or publishing a desktop or mobile build, or upgrading a Tauri 1 or 2.0 beta project.

tokio-docs

Gives current guidance from the official tokio documentation (tokio 1.54.1) on async Rust pitfalls, cancel safety, blocking code, surprising defaults and deprecated APIs. Use when writing, reviewing or debugging async Rust code that uses tokio, especially the runtime (#[tokio::main], #[tokio::test], Builder, enable_all, block_on, current_thread, LocalRuntime, shutdown, feature flags), tasks (spawn, JoinHandle, JoinSet, abort, spawn_blocking, block_in_place, LocalSet, spawn_local, task_local), select!, join!, try_join!, cancellation and graceful shutdown, sync primitives (Mutex across .await, RwLock, Semaphore, Notify, OnceCell), channels (mpsc backpressure, oneshot, broadcast lag, watch), time (sleep, interval, MissedTickBehavior, timeout, paused time, start_paused), I/O and networking (AsyncReadExt, BufWriter flush, split, io::copy, framing, TcpListener, TcpStream, UdpSocket), tokio::fs, process (Command, kill_on_drop, Child), signals (ctrl_c, Windows console events) and Windows named pipes.

typescript-docs

Configures, writes and upgrades TypeScript 6.0 code and tsconfig.json from the official TypeScript documentation. Use when upgrading from TypeScript 5.x to 6.0 (strict, types, rootDir, baseUrl, moduleResolution node, target es5, outFile, esModuleInterop), choosing module and moduleResolution, writing package.json exports and imports, fixing ESM and CommonJS interop, enabling verbatimModuleSyntax or erasableSyntaxOnly, setting up project references and tsc --build, writing .d.ts files, checking JavaScript with JSDoc, or debugging narrowing, generics, mapped types, decorators and enums. Triggers on TypeScript, tsc, tsconfig, TS5112, ignoreDeprecations, nodenext, bundler, .d.ts, @ts-check, TypeScript 6 upgrade.

typesense-docs

Pitfalls, surprising defaults and recommended patterns of the Typesense search engine, distilled from the official docs. Use when designing a Typesense collection schema, writing search parameters (q, query_by, filter_by, sort_by, facet_by, group_by), tuning typo tolerance and ranking, building vector, semantic or hybrid search, conversational RAG or natural language search, creating API keys and scoped search keys for multi-tenancy, indexing and import (JSONL, upsert, emplace, dirty_values), syncing from a primary database, reindexing through aliases, managing synonyms (synonym sets), curation sets and stopwords, joins, analytics rules and query suggestions, InstantSearch, migrating from Algolia, or running, clustering, backing up and upgrading a Typesense server.

vite-docs

Teaches current Vite 8 practices drawn from the official documentation. Use when writing or fixing a vite.config, migrating from Vite 7 (Rolldown and Oxc replacing Rollup and esbuild), configuring the dev server, proxy or HMR, handling import.meta.env and modes, tuning the production build, library mode, SSR, writing a Vite plugin, using the HMR or JavaScript API, or the Environment API. Triggers on vite.config, defineConfig, rolldownOptions, import.meta.env, loadEnv, optimizeDeps, ssrLoadModule, ModuleRunner, this.environment, upgrade to Vite 8.

vitest-docs

Teaches current Vitest 5 practices drawn from the official documentation. Use when writing, reviewing or fixing Vitest tests (test, describe, expect, test.for, fixtures with test.extend, hooks, snapshots), mocking with vi (vi.fn, vi.spyOn, vi.mock, vi.when, fake timers, stubGlobal, stubEnv), configuring vitest.config or projects, choosing an environment or pool, filtering and running tests in CI, measuring coverage with v8 or istanbul, debugging slow or flaky suites, testing components in browser mode with Playwright, or migrating from Jest, Mocha or Vitest 4. Triggers on vitest, vi.mock, vi.fn, vitest.config, toMatchSnapshot, expect.poll, coverage thresholds, browser mode, @vitest/browser-playwright, jsdom, happy-dom, migrate Jest to Vitest, upgrade Vitest 5.

相关技能