Loading...
Loading...
Compare original and translation side by side
schemaDirschemaDir.graphql.graphqlundefinedundefined
Or programmatically:
```typescript
import { generate } from '@constructive-io/graphql-codegen';
// Export from database
await generate({
db: { schemas: ['public'] },
schemaOnly: true,
schemaOnlyOutput: './schemas',
schemaOnlyFilename: 'public.graphql',
});
// Export from PGPM module
await generate({
db: {
pgpm: { modulePath: './packages/my-module' },
schemas: ['app_public'],
},
schemaOnly: true,
schemaOnlyOutput: './schemas',
schemaOnlyFilename: 'app_public.graphql',
});
或通过编程方式导出:
```typescript
import { generate } from '@constructive-io/graphql-codegen';
// 从数据库导出
await generate({
db: { schemas: ['public'] },
schemaOnly: true,
schemaOnlyOutput: './schemas',
schemaOnlyFilename: 'public.graphql',
});
// 从PGPM模块导出
await generate({
db: {
pgpm: { modulePath: './packages/my-module' },
schemas: ['app_public'],
},
schemaOnly: true,
schemaOnlyOutput: './schemas',
schemaOnlyFilename: 'app_public.graphql',
});schemaDir.graphql// graphql-codegen.config.ts
import { defineConfig } from '@constructive-io/graphql-codegen';
export default defineConfig({
schemaDir: './schemas', // Directory of .graphql files
output: './generated', // Each file becomes ./generated/{name}/
reactQuery: true,
orm: true,
});npx @constructive-io/graphql-codegen -c graphql-codegen.config.tsschemas/public.graphqlschemas/admin.graphqlgenerated/
public/ # Generated from public.graphql
hooks/
orm/
admin/ # Generated from admin.graphql
hooks/
orm/.graphqlschemaDir// graphql-codegen.config.ts
import { defineConfig } from '@constructive-io/graphql-codegen';
export default defineConfig({
schemaDir: './schemas', // .graphql文件所在目录
output: './generated', // 每个文件会生成到./generated/{name}/目录下
reactQuery: true,
orm: true,
});npx @constructive-io/graphql-codegen -c graphql-codegen.config.tsschemas/public.graphqlschemas/admin.graphqlgenerated/
public/ # 从public.graphql生成
hooks/
orm/
admin/ # 从admin.graphql生成
hooks/
orm/pnpm add @constructive-io/graphql-codegenpnpm add @constructive-io/graphql-codegennpx @constructive-io/graphql-codegen --react-query -s ./schemas/public.graphql -o ./generatednpx @constructive-io/graphql-codegen --react-query -s ./schemas/public.graphql -o ./generatednpx @constructive-io/graphql-codegen --orm -s ./schemas/public.graphql -o ./generatednpx @constructive-io/graphql-codegen --orm -s ./schemas/public.graphql -o ./generatednpx @constructive-io/graphql-codegen --cli -s ./schemas/public.graphql -o ./generatednpx @constructive-io/graphql-codegen --cli -s ./schemas/public.graphql -o ./generatednpx @constructive-io/graphql-codegen --react-query -e https://api.example.com/graphql -o ./generatednpx @constructive-io/graphql-codegen --react-query -e https://api.example.com/graphql -o ./generatednpx @constructive-io/graphql-codegen --react-query --schemas public,app_public -o ./generatednpx @constructive-io/graphql-codegen --react-query --schemas public,app_public -o ./generatedgenerate()generate()import { generate } from '@constructive-io/graphql-codegen';
// Generate from endpoint
await generate({
endpoint: 'https://api.example.com/graphql',
output: './generated',
reactQuery: true,
orm: true,
});
// Node.js with undici dispatcher (fixes localhost DNS issues)
await generate({
endpoint: 'http://api.localhost:3000/graphql',
output: './generated',
reactQuery: true,
browserCompatible: false, // Use undici with custom dispatcher
});import { generate } from '@constructive-io/graphql-codegen';
// 从端点生成
await generate({
endpoint: 'https://api.example.com/graphql',
output: './generated',
reactQuery: true,
orm: true,
});
// Node.js环境使用undici调度器(解决localhost DNS问题)
await generate({
endpoint: 'http://api.localhost:3000/graphql',
output: './generated',
reactQuery: true,
browserCompatible: false, // 使用带自定义调度器的undici
});// From GraphQL endpoint
await generate({
endpoint: 'https://api.example.com/graphql',
headers: { Authorization: 'Bearer token' },
reactQuery: true,
});
// From schema file
await generate({
schemaFile: './schema.graphql',
output: './generated',
orm: true,
});
// From database (explicit schemas)
await generate({
db: { schemas: ['public', 'app_public'] },
reactQuery: true,
});
// From database (auto-discover via API names)
await generate({
db: { apiNames: ['my_api'] },
orm: true,
});
// From PGPM module
await generate({
db: {
pgpm: { modulePath: './packages/my-module' },
schemas: ['public'],
},
reactQuery: true,
});// 从GraphQL端点
await generate({
endpoint: 'https://api.example.com/graphql',
headers: { Authorization: 'Bearer token' },
reactQuery: true,
});
// 从Schema文件
await generate({
schemaFile: './schema.graphql',
output: './generated',
orm: true,
});
// 从数据库(指定Schema)
await generate({
db: { schemas: ['public', 'app_public'] },
reactQuery: true,
});
// 从数据库(通过API名称自动发现)
await generate({
db: { apiNames: ['my_api'] },
orm: true,
});
// 从PGPM模块
await generate({
db: {
pgpm: { modulePath: './packages/my-module' },
schemas: ['public'],
},
reactQuery: true,
});interface GenerateOptions {
// Schema source (choose one)
endpoint?: string;
schemaFile?: string;
schemaDir?: string; // Directory of .graphql files — auto-expands to multi-target
db?: {
config?: { host, port, database, user, password };
schemas?: string[];
apiNames?: string[]; // Auto-discover schemas from services_public.api_schemas
pgpm?: { modulePath, workspacePath, moduleName };
keepDb?: boolean; // Keep ephemeral DB after introspection (debugging)
};
// Output
output?: string; // Default: './generated/graphql'
// Generators
reactQuery?: boolean; // Default: false
orm?: boolean; // Default: false
cli?: CliConfig | boolean; // Default: false — generate inquirerer CLI
// Schema export (instead of code generation)
schemaOnly?: boolean; // Export schema to .graphql file, skip codegen
schemaOnlyOutput?: string; // Output directory for exported schema
schemaOnlyFilename?: string; // Filename (default: 'schema.graphql')
// Documentation (generated alongside code)
docs?: DocsConfig | boolean; // Default: { readme: true, agents: true, mcp: false, skills: false }
// Node.js HTTP adapter (auto-enabled when cli is true)
nodeHttpAdapter?: boolean; // Default: false
// Filtering
tables?: { include?, exclude?, systemExclude? };
queries?: { include?, exclude?, systemExclude? };
mutations?: { include?, exclude?, systemExclude? };
excludeFields?: string[];
// Authentication
headers?: Record<string, string>;
authorization?: string; // Convenience for Authorization header
// Options
verbose?: boolean;
dryRun?: boolean;
skipCustomOperations?: boolean;
}interface GenerateOptions {
// Schema源(选其一)
endpoint?: string;
schemaFile?: string;
schemaDir?: string; // .graphql文件目录 — 自动扩展为多目标
db?: {
config?: { host, port, database, user, password };
schemas?: string[];
apiNames?: string[]; // 从services_public.api_schemas自动发现Schema
pgpm?: { modulePath, workspacePath, moduleName };
keepDb?: boolean; // 自省后保留临时数据库(用于调试)
};
// 输出
output?: string; // 默认值: './generated/graphql'
// 生成器
reactQuery?: boolean; // 默认值: false
orm?: boolean; // 默认值: false
cli?: CliConfig | boolean; // 默认值: false — 生成inquirerer CLI
// Schema导出(替代代码生成)
schemaOnly?: boolean; // 将Schema导出为.graphql文件,跳过代码生成
schemaOnlyOutput?: string; // 导出Schema的输出目录
schemaOnlyFilename?: string; // 文件名(默认: 'schema.graphql')
// 文档(与代码同时生成)
docs?: DocsConfig | boolean; // 默认值: { readme: true, agents: true, mcp: false, skills: false }
// Node.js HTTP适配器(启用CLI时自动开启)
nodeHttpAdapter?: boolean; // 默认值: false
// 过滤
tables?: { include?, exclude?, systemExclude? };
queries?: { include?, exclude?, systemExclude? };
mutations?: { include?, exclude?, systemExclude? };
excludeFields?: string[];
// 认证
headers?: Record<string, string>;
authorization?: string; // 便捷设置Authorization头
// 其他选项
verbose?: boolean;
dryRun?: boolean;
skipCustomOperations?: boolean;
}// scripts/codegen.ts
import { generate } from '@constructive-io/graphql-codegen';
async function main() {
console.log('Generating GraphQL code...');
const result = await generate({
endpoint: process.env.GRAPHQL_ENDPOINT!,
headers: {
Authorization: `Bearer ${process.env.API_TOKEN}`,
},
output: './src/generated',
reactQuery: true,
orm: true,
tables: {
include: ['User', 'Post', 'Comment'],
},
});
if (!result.success) {
console.error('Codegen failed:', result.error);
process.exit(1);
}
console.log('✓ Code generated successfully');
}
main();// scripts/codegen.ts
import { generate } from '@constructive-io/graphql-codegen';
async function main() {
console.log('生成GraphQL代码...');
const result = await generate({
endpoint: process.env.GRAPHQL_ENDPOINT!,
headers: {
Authorization: `Bearer ${process.env.API_TOKEN}`,
},
output: './src/generated',
reactQuery: true,
orm: true,
tables: {
include: ['User', 'Post', 'Comment'],
},
});
if (!result.success) {
console.error('代码生成失败:', result.error);
process.exit(1);
}
console.log('✓ 代码生成成功');
}
main();graphql-codegen| Command | Purpose |
|---|---|
| Generate code (use |
| Generate React Query hooks |
| Generate ORM client |
| Generate inquirerer-based CLI |
| Generate all three |
graphql-codegen| 命令 | 用途 |
|---|---|
| 生成代码(使用 |
| 生成React Query hooks |
| 生成ORM客户端 |
| 生成基于inquirerer的CLI |
| 同时生成以上三种产物 |
| Option | Description |
|---|---|
| GraphQL endpoint URL |
| Path to GraphQL schema file |
| Directory of |
| PostgreSQL schemas (comma-separated) |
| API names for auto schema discovery |
| Output directory (default: |
| Config file path |
| Generate React Query hooks |
| Generate ORM client |
| Generate inquirerer-based CLI |
| Export schema to |
| Output directory for schema export |
| Filename for exported schema (default: |
| Authorization header |
| Target name in multi-target config |
| Preview without writing |
| Show detailed output |
| 选项 | 说明 |
|---|---|
| GraphQL端点URL |
| GraphQL Schema文件路径 |
| .graphql文件目录(自动多目标) |
| PostgreSQL Schema(逗号分隔) |
| 用于自动发现Schema的API名称 |
| 输出目录(默认: |
| 配置文件路径 |
| 生成React Query hooks |
| 生成ORM客户端 |
| 生成基于inquirerer的CLI |
| 将Schema导出为.graphql文件(不生成代码) |
| Schema导出的输出目录 |
| 导出Schema的文件名(默认: |
| Authorization头 |
| 多目标配置中的目标名称 |
| 预览生成结果,不写入文件 |
| 显示详细输出 |
graphql-codegen.config.tsimport { defineConfig } from '@constructive-io/graphql-codegen';
// RECOMMENDED: From a directory of .graphql schema files
export default defineConfig({
schemaDir: './schemas',
output: './generated',
reactQuery: true,
orm: true,
});
// From a single schema file
export default defineConfig({
schemaFile: './schemas/public.graphql',
output: './generated',
reactQuery: true,
orm: true,
});
// From GraphQL endpoint
export default defineConfig({
endpoint: 'https://api.example.com/graphql',
output: './generated',
reactQuery: true,
orm: true,
headers: {
Authorization: `Bearer ${process.env.API_TOKEN}`,
},
});
// From database
export default defineConfig({
db: {
schemas: ['public', 'app_public'], // Explicit schemas
// OR
apiNames: ['my_api'], // Auto-discover schemas from API
},
output: './generated',
reactQuery: true,
});
// From PGPM module
export default defineConfig({
db: {
pgpm: { modulePath: './packages/my-module' },
schemas: ['public'],
},
output: './generated',
orm: true,
});graphql-codegen.config.tsimport { defineConfig } from '@constructive-io/graphql-codegen';
// 推荐:从.graphql Schema文件目录生成
export default defineConfig({
schemaDir: './schemas',
output: './generated',
reactQuery: true,
orm: true,
});
// 从单个Schema文件生成
export default defineConfig({
schemaFile: './schemas/public.graphql',
output: './generated',
reactQuery: true,
orm: true,
});
// 从GraphQL端点生成
export default defineConfig({
endpoint: 'https://api.example.com/graphql',
output: './generated',
reactQuery: true,
orm: true,
headers: {
Authorization: `Bearer ${process.env.API_TOKEN}`,
},
});
// 从数据库生成
export default defineConfig({
db: {
schemas: ['public', 'app_public'], // 指定Schema
// 或
apiNames: ['my_api'], // 从API自动发现Schema
},
output: './generated',
reactQuery: true,
});
// 从PGPM模块生成
export default defineConfig({
db: {
pgpm: { modulePath: './packages/my-module' },
schemas: ['public'],
},
output: './generated',
orm: true,
});export default defineConfig({
endpoint: 'https://api.example.com/graphql',
output: './generated',
cli: true, // Generate CLI with default tool name
// OR with options:
cli: {
toolName: 'myapp', // Config stored at ~/.myapp/
entryPoint: true, // Generate runnable index.ts
builtinNames: { // Override infra command names
auth: 'credentials',
context: 'env',
},
},
});cli: truenodeHttpAdapterexport default defineConfig({
endpoint: 'https://api.example.com/graphql',
output: './generated',
cli: true, // 使用默认工具名称生成CLI
// 或自定义选项:
cli: {
toolName: 'myapp', // 配置存储在~/.myapp/
entryPoint: true, // 生成可执行的index.ts
builtinNames: { // 覆盖基础命令名称
auth: 'credentials',
context: 'env',
},
},
});cli: truenodeHttpAdapterexport default defineConfig({
endpoint: 'https://api.example.com/graphql',
output: './generated',
orm: true,
docs: true, // Enable all doc formats
// OR configure individually:
docs: {
readme: true, // README.md — human-readable overview
agents: true, // AGENTS.md — structured for LLM consumption
mcp: false, // mcp.json — MCP tool definitions
skills: true, // skills/ — per-command .md skill files (Devin-compatible)
},
});docs.skillsskills/.mddocs.agentsAGENTS.mddocs.mcpmcp.jsoninputSchemaexport default defineConfig({
endpoint: 'https://api.example.com/graphql',
output: './generated',
orm: true,
docs: true, // 启用所有文档格式
// 或单独配置:
docs: {
readme: true, // README.md — 人类可读的概览文档
agents: true, // AGENTS.md — 为LLM设计的结构化文档
mcp: false, // mcp.json — MCP工具定义
skills: true, // skills/ — 每个命令对应一个.md技能文件(兼容Devin)
},
});docs.skillsskills/docs.agentsAGENTS.mddocs.mcpmcp.jsoninputSchemaexport default defineConfig({
endpoint: 'http://api.localhost:3000/graphql',
output: './generated',
orm: true,
nodeHttpAdapter: true, // Generates node-fetch.ts with NodeHttpAdapter
});NodeHttpAdapternode:httpnode:httpsauth.localhost:3000import { NodeHttpAdapter } from './orm/node-fetch';
import { createClient } from './orm';
const db = createClient({
adapter: new NodeHttpAdapter(endpoint, headers),
});export default defineConfig({
endpoint: 'http://api.localhost:3000/graphql',
output: './generated',
orm: true,
nodeHttpAdapter: true, // 生成带有NodeHttpAdapter的node-fetch.ts
});NodeHttpAdapternode:httpnode:httpsauth.localhost:3000import { NodeHttpAdapter } from './orm/node-fetch';
import { createClient } from './orm';
const db = createClient({
adapter: new NodeHttpAdapter(endpoint, headers),
});schemaDir.graphqlexport default defineConfig({
schemaDir: './schemas', // Contains public.graphql, admin.graphql, etc.
output: './generated', // Produces ./generated/public/, ./generated/admin/, etc.
reactQuery: true,
orm: true,
});schemaDirexport default defineConfig({
schemaDir: './schemas', // 包含public.graphql、admin.graphql等
output: './generated', // 生成./generated/public/、./generated/admin/等
reactQuery: true,
orm: true,
});export default defineConfig({
public: {
schemaFile: './schemas/public.graphql',
output: './generated/public',
reactQuery: true,
},
admin: {
schemaFile: './schemas/admin.graphql',
output: './generated/admin',
orm: true,
cli: true,
},
});export default defineConfig({
public: {
schemaFile: './schemas/public.graphql',
output: './generated/public',
reactQuery: true,
},
admin: {
schemaFile: './schemas/admin.graphql',
output: './generated/admin',
orm: true,
cli: true,
},
});db.apiNamesexport default defineConfig({
db: { apiNames: ['public', 'admin'] },
output: './generated', // Produces ./generated/public/, ./generated/admin/
orm: true,
});services_public.api_schemasdb.apiNamesexport default defineConfig({
db: { apiNames: ['public', 'admin'] },
output: './generated', // 生成./generated/public/、./generated/admin/
orm: true,
});services_public.api_schemasimport { configure } from '@/generated/hooks';
configure({
endpoint: process.env.NEXT_PUBLIC_GRAPHQL_URL!,
headers: { Authorization: `Bearer ${getToken()}` },
});import { configure } from '@/generated/hooks';
configure({
endpoint: process.env.NEXT_PUBLIC_GRAPHQL_URL!,
headers: { Authorization: `Bearer ${getToken()}` },
});import { useUsersQuery } from '@/generated/hooks';
function UserList() {
const { data, isLoading } = useUsersQuery({
first: 10,
filter: { role: { eq: 'ADMIN' } },
});
if (isLoading) return <Spinner />;
return <ul>{data?.users?.nodes.map(u => <li key={u.id}>{u.name}</li>)}</ul>;
}import { useUsersQuery } from '@/generated/hooks';
function UserList() {
const { data, isLoading } = useUsersQuery({
first: 10,
filter: { role: { eq: 'ADMIN' } },
});
if (isLoading) return <Spinner />;
return <ul>{data?.users?.nodes.map(u => <li key={u.id}>{u.name}</li>)}</ul>;
}import { useCreateUserMutation } from '@/generated/hooks';
function CreateUser() {
const createUser = useCreateUserMutation();
return (
<button onClick={() => createUser.mutate({ input: { name: 'John' } })}>
Create
</button>
);
}import { useCreateUserMutation } from '@/generated/hooks';
function CreateUser() {
const createUser = useCreateUserMutation();
return (
<button onClick={() => createUser.mutate({ input: { name: 'John' } })}>
创建用户
</button>
);
}cli: true{output}/cli/cli: true{output}/cli/generated/cli/
commands/ # One file per table + custom operations
users.ts # CRUD commands for users table
posts.ts # CRUD commands for posts table
my-query.ts # Custom query command
command-map.ts # Maps command names to handlers
executor.ts # Command executor with auth context
utils.ts # Shared utilities
node-fetch.ts # NodeHttpAdapter for localhost
index.ts # Entry point (if entryPoint: true)generated/cli/
commands/ # 每个表和自定义操作对应一个文件
users.ts # 用户表的CRUD命令
posts.ts # 帖子表的CRUD命令
my-query.ts # 自定义查询命令
command-map.ts # 命令名称到处理器的映射
executor.ts # 带认证上下文的命令执行器
utils.ts # 共享工具函数
node-fetch.ts # 用于localhost的NodeHttpAdapter
index.ts # 入口文件(如果entryPoint: true)entryPoint: truenpx ts-node generated/cli/index.tsimport { commands } from './generated/cli/command-map';
import { Inquirerer } from 'inquirerer';
const prompter = new Inquirerer();
await commands.users.list(argv, prompter);entryPoint: truenpx ts-node generated/cli/index.tsimport { commands } from './generated/cli/command-map';
import { Inquirerer } from 'inquirerer';
const prompter = new Inquirerer();
await commands.users.list(argv, prompter);credentialsenvcredentialsenvimport { createClient } from '@/generated/orm';
export const db = createClient({
endpoint: process.env.GRAPHQL_URL!,
headers: { Authorization: `Bearer ${process.env.API_TOKEN}` },
});import { createClient } from '@/generated/orm';
export const db = createClient({
endpoint: process.env.GRAPHQL_URL!,
headers: { Authorization: `Bearer ${process.env.API_TOKEN}` },
});const users = await db.user.findMany({
select: { id: true, name: true, email: true },
filter: { role: { eq: 'ADMIN' } },
first: 10,
}).execute().unwrap();const users = await db.user.findMany({
select: { id: true, name: true, email: true },
filter: { role: { eq: 'ADMIN' } },
first: 10,
}).execute().unwrap();const posts = await db.post.findMany({
select: {
id: true,
title: true,
author: { select: { id: true, name: true } },
},
}).execute().unwrap();
// posts[0].author.name is fully typedconst posts = await db.post.findMany({
select: {
id: true,
title: true,
author: { select: { id: true, name: true } },
},
}).execute().unwrap();
// posts[0].author.name是完全类型化的const result = await db.user.findOne({ id: '123' }).execute();
if (result.ok) {
console.log(result.value.name);
} else {
console.error(result.error.message);
}
// Or use helpers
const user = await db.user.findOne({ id }).execute().unwrap(); // throws on error
const user = await db.user.findOne({ id }).execute().unwrapOr(defaultUser);const result = await db.user.findOne({ id: '123' }).execute();
if (result.ok) {
console.log(result.value.name);
} else {
console.error(result.error.message);
}
// 或使用辅助函数
const user = await db.user.findOne({ id }).execute().unwrap(); // 错误时抛出异常
const user = await db.user.findOne({ id }).execute().unwrapOr(defaultUser);schemaDir| Priority | Source | Config Key | Best For |
|---|---|---|---|
| 1 (recommended) | Schema directory | | Deterministic, portable, multi-target |
| 2 | Schema file | | Single schema, simple projects |
| 3 | PGPM module (path) | | Schema export from a pgpm module |
| 4 | PGPM workspace | | Schema export from a pgpm workspace |
| 5 | Database | | Schema export from a live database |
| 6 | Endpoint | | Schema export from a running server |
schemaDir| 优先级 | 源 | 配置键 | 最佳适用场景 |
|---|---|---|---|
| 1(推荐) | Schema目录 | | 确定性、可移植性、多目标场景 |
| 2 | Schema文件 | | 单一Schema、简单项目 |
| 3 | PGPM模块(路径) | | 从pgpm模块导出Schema |
| 4 | PGPM工作区 | | 从pgpm工作区导出Schema |
| 5 | 数据库 | | 从实时数据库导出Schema |
| 6 | 端点 | | 从运行中的服务器导出Schema |
npx @constructive-io/graphql-codegen --react-query --orm --schema-dir ./schemas -o ./generatednpx @constructive-io/graphql-codegen --react-query --orm --schema-dir ./schemas -o ./generatednpx @constructive-io/graphql-codegen --react-query -s ./schemas/public.graphql -o ./generatednpx @constructive-io/graphql-codegen --react-query -s ./schemas/public.graphql -o ./generatednpx @constructive-io/graphql-codegen --react-query -e https://api.example.com/graphqlnpx @constructive-io/graphql-codegen --react-query -e https://api.example.com/graphqlundefinedundefinedundefinedundefined// In config file — direct path
export default defineConfig({
db: {
pgpm: { modulePath: './packages/my-module' },
schemas: ['public'],
},
reactQuery: true,
});
// In config file — workspace + module name
export default defineConfig({
db: {
pgpm: {
workspacePath: '.',
moduleName: 'my-module',
},
schemas: ['app_public'],
},
orm: true,
});keepDb: true// 配置文件中 — 直接路径
export default defineConfig({
db: {
pgpm: { modulePath: './packages/my-module' },
schemas: ['public'],
},
reactQuery: true,
});
// 配置文件中 — 工作区 + 模块名称
export default defineConfig({
db: {
pgpm: {
workspacePath: '.',
moduleName: 'my-module',
},
schemas: ['app_public'],
},
orm: true,
});keepDb: trueschemaOnly: true.graphqlschemaOnly: trueundefinedundefinedundefinedundefinedimport { generate } from '@constructive-io/graphql-codegen';
const result = await generate({
db: { schemas: ['public'] },
schemaOnly: true,
schemaOnlyOutput: './schemas',
schemaOnlyFilename: 'public.graphql',
});
console.log(result.message); // "Schema exported to ./schemas/public.graphql"import { generate } from '@constructive-io/graphql-codegen';
const result = await generate({
db: { schemas: ['public'] },
schemaOnly: true,
schemaOnlyOutput: './schemas',
schemaOnlyFilename: 'public.graphql',
});
console.log(result.message); // "Schema已导出到./schemas/public.graphql"| Option | Description | Default |
|---|---|---|
| Enable schema export mode (no code generation) | |
| Output directory for the exported schema | Same as |
| Filename for the exported schema | |
| 选项 | 说明 | 默认值 |
|---|---|---|
| 启用Schema导出模式(不生成代码) | |
| 导出Schema的输出目录 | 与 |
| 导出Schema的文件名 | |
import { userKeys, invalidate, remove } from '@/generated/hooks';
import { useQueryClient } from '@tanstack/react-query';
const queryClient = useQueryClient();
// Invalidate queries (triggers refetch)
invalidate.user.all(queryClient); // All user queries
invalidate.user.lists(queryClient); // All list queries
invalidate.user.detail(queryClient, id); // Specific user
// Remove from cache (for delete operations)
remove.user(queryClient, userId);
// Track in-flight mutations
import { userMutationKeys } from '@/generated/hooks';
import { useIsMutating } from '@tanstack/react-query';
const isMutating = useIsMutating({ mutationKey: userMutationKeys.all });references/query-keys.mdimport { userKeys, invalidate, remove } from '@/generated/hooks';
import { useQueryClient } from '@tanstack/react-query';
const queryClient = useQueryClient();
// 使查询失效(触发重新获取)
invalidate.user.all(queryClient); // 所有用户相关查询
invalidate.user.lists(queryClient); // 所有列表查询
invalidate.user.detail(queryClient, id); // 特定用户查询
// 从缓存中移除(用于删除操作)
remove.user(queryClient, userId);
// 跟踪进行中的修改操作
import { userMutationKeys } from '@/generated/hooks';
import { useIsMutating } from '@tanstack/react-query';
const isMutating = useIsMutating({ mutationKey: userMutationKeys.all });references/query-keys.md// Comparison
filter: { age: { eq: 25 } }
filter: { age: { gte: 18, lt: 65 } }
filter: { status: { in: ['ACTIVE', 'PENDING'] } }
// String
filter: { name: { contains: 'john' } }
filter: { email: { endsWith: '.com' } }
// Logical
filter: {
OR: [
{ role: { eq: 'ADMIN' } },
{ role: { eq: 'MODERATOR' } },
],
}// 比较操作
filter: { age: { eq: 25 } }
filter: { age: { gte: 18, lt: 65 } }
filter: { status: { in: ['ACTIVE', 'PENDING'] } }
// 字符串操作
filter: { name: { contains: 'john' } }
filter: { email: { endsWith: '.com' } }
// 逻辑操作
filter: {
OR: [
{ role: { eq: 'ADMIN' } },
{ role: { eq: 'MODERATOR' } },
],
}| Issue | Solution |
|---|---|
| No hooks generated | Add |
| No CLI generated | Add |
| Schema not accessible | Verify endpoint URL and auth headers |
Missing | Ensure PostGraphile v5+ with Meta plugin |
| Type errors after regeneration | Delete output directory and regenerate |
| Import errors | Verify generated code exists and paths match |
| Auth errors at runtime | Check |
| Localhost fetch errors (Node.js) | Enable |
| No skill files generated | Set |
| Schema export produces empty file | Verify database/endpoint has tables in the specified schemas |
| Ensure directory contains |
| 问题 | 解决方案 |
|---|---|
| 未生成Hooks | 在配置中添加 |
| 未生成CLI | 在配置中添加 |
| Schema无法访问 | 验证端点URL和认证头 |
缺少 | 确保使用PostGraphile v5+并启用Meta插件 |
| 重新生成后出现类型错误 | 删除输出目录并重新生成 |
| 导入错误 | 验证生成的代码是否存在,路径是否匹配 |
| 运行时认证错误 | 检查 |
| Node.js环境下localhost请求错误 | 启用 |
| 未生成技能文件 | 在配置中设置 |
| Schema导出后文件为空 | 验证数据库/端点的指定Schema中是否包含表 |
| 确保目录中包含.graphql文件(不支持.gql或其他扩展名) |
cli-reference.mdconfig-reference.mdhooks-patterns.mdorm-patterns.mderror-handling.mdrelations.mdquery-keys.mdhooks-output.mdorm-output.mdcli-reference.mdconfig-reference.mdhooks-patterns.mdorm-patterns.mderror-handling.mdrelations.mdquery-keys.mdhooks-output.mdorm-output.md