PostgreSQL - psql 命令行工具的常用操作与快捷键

PostgreSQL - psql 命令行工具的常用操作与快捷键
在这里插入图片描述
👋 大家好,欢迎来到我的技术博客!
📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。
🎯 本文将围绕postgresql这个话题展开,希望能为你带来一些启发或实用的参考。
🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获!

文章目录

PostgreSQL - psql 命令行工具的常用操作与快捷键 🛠️

在 PostgreSQL 的世界里,psql 是最核心、最强大的命令行工具之一。它不仅是数据库管理员(DBA)的得力助手,也是开发者进行日常开发和调试不可或缺的利器。无论是执行 SQL 查询、管理数据库对象、还是进行性能分析,psql 都能提供高效便捷的操作体验。本文将带你深入了解 psql 的常用操作与快捷键,结合实际示例和 Java 代码,让你熟练掌握这个强大的工具。

一、psql 是什么?为什么重要? 🤔

1. 什么是 psql?

psql 是 PostgreSQL 自带的命令行客户端工具,它允许用户通过终端界面与 PostgreSQL 数据库服务器进行交互。它提供了一个交互式的环境,让用户可以输入 SQL 命令、执行查询、查看结果,并且拥有丰富的辅助功能。

2. 为什么重要?

  • 直接访问: psql 提供了对数据库的直接、低级别的访问,无需依赖图形化工具。
  • 灵活性: 可以执行任何 SQL 语句,支持复杂的查询和批处理脚本。
  • 性能: 相比 GUI 工具,psql 通常更轻量级,响应更快。
  • 自动化: 可以轻松地将 psql 命令集成到 shell 脚本或自动化任务中。
  • 调试: 对于复杂的查询或性能问题,psql 提供的 EXPLAINEXPLAIN ANALYZE 功能非常强大。
  • 学习: 熟练使用 psql 是掌握 PostgreSQL 的基础。

3. 启动 psql

启动 psql 很简单,只需在终端中输入:

psql -U username -d database_name 

或者,如果用户和数据库名与当前系统用户相同,可以简化为:

psql 

二、psql 基础交互操作 🔧

1. 连接数据库

# 连接到特定数据库 psql -U myuser -d mydb # 连接到特定主机和端口 psql -h localhost -p 5432 -U myuser -d mydb # 使用 .pgpass 文件设置密码(推荐) psql -U myuser -d mydb 

2. 基本命令

psql 有两类命令:SQL 命令和 psql 特有的元命令(Meta-commands)。元命令以反斜杠 \ 开头。

2.1 SQL 命令

SQL 命令是标准的数据库操作,如 SELECTINSERTUPDATEDELETECREATE TABLE 等。

-- 查看表SELECT*FROM employees LIMIT5;-- 插入数据INSERTINTO employees (first_name, last_name, email)VALUES('John','Doe','[email protected]');-- 更新数据UPDATE employees SET salary =75000.00WHERE id =1;-- 删除数据DELETEFROM employees WHERE id =1;
2.2 元命令 (Meta-Commands)

元命令是 psql 特有的命令,用于控制 psql 本身的环境和行为。

2.2.1 显示连接信息
\conninfo -- 显示当前连接的数据库信息
2.2.2 切换数据库
\c database_name [username]-- 切换到另一个数据库
2.2.3 显示表结构
\d table_name -- 显示表的详细定义 \d+ table_name -- 显示表的详细定义(包括大小等信息)
2.2.4 显示所有表
\dt -- 显示所有用户表 \dt+-- 显示所有用户表及其大小
2.2.5 显示所有索引
\di -- 显示所有索引 \di+-- 显示所有索引及其详细信息
2.2.6 显示所有视图
\dv -- 显示所有视图
2.2.7 显示所有序列
\ds -- 显示所有序列
2.2.8 显示所有函数
\df -- 显示所有函数
2.2.9 显示所有用户
\du -- 显示所有用户角色
2.2.10 显示数据库
\l -- 显示所有数据库
2.2.11 执行文件
\i filename -- 执行一个 SQL 文件
2.2.12 导出数据
\o output_file -- 将输出重定向到文件SELECT*FROM employees; \o -- 恢复标准输出
2.2.13 退出 psql
\q -- 退出 psql

3. 实际示例:创建和管理表

让我们通过一个完整的例子来演示如何在 psql 中创建和管理表。

-- 创建一个员工表CREATETABLE employees ( id SERIALPRIMARYKEY, first_name VARCHAR(50)NOTNULL, last_name VARCHAR(50)NOTNULL, email VARCHAR(100)NOTNULLUNIQUE, department_id INTEGER, salary NUMERIC(10,2), hire_date DATENOTNULL);-- 插入一些测试数据INSERTINTO employees (first_name, last_name, email, department_id, salary, hire_date)VALUES('Alice','Johnson','[email protected]',10,75000.00,'2023-01-15'),('Bob','Smith','[email protected]',20,65000.00,'2023-02-20'),('Charlie','Brown','[email protected]',10,70000.00,'2023-03-10');-- 查看表结构 \d employees -- 查看表内容SELECT*FROM employees;-- 查看表信息 \d+ employees 

三、psql 的快捷键与交互技巧 ⌨️

1. 命令行编辑快捷键

psql 使用 Readline 库,因此支持许多标准的键盘快捷键。

  • Ctrl + A: 移动到行首
  • Ctrl + E: 移动到行尾
  • Ctrl + U: 清除整行
  • Ctrl + K: 清除从光标到行尾
  • Ctrl + W: 删除前一个单词
  • Ctrl + R: 搜索历史命令(向前搜索)
  • Ctrl + S: 搜索历史命令(向后搜索)
  • Tab: 自动补全命令或表名、列名等

2. 命令历史操作

psql 会保存你的命令历史。你可以使用上下箭头键来浏览历史命令。

-- 输入部分命令,然后按向上箭头键,可以快速找到之前的类似命令SELECT*FROM emp -- 按上箭头,可能会出现之前输入的 SELECT * FROM employees

3. 多行输入

psql 支持多行输入,这对于编写较长的 SQL 语句非常有用。

-- 输入多行 SQL 语句SELECT e.first_name, e.last_name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.id WHERE e.salary >70000ORDERBY e.salary DESC;

4. 高亮显示与格式化输出

psql 默认会以表格形式显示查询结果,但你可以调整格式。

-- 设置输出格式为 CSV \a \crosstab \o output.csv SELECT*FROM employees; \o \crosstab \a -- 设置输出格式为纯文本 \t \o output.txt SELECT*FROM employees; \o \t -- 设置列宽 \pset columns80

四、psql 的高级功能与技巧 💡

1. 使用变量

psql 支持变量替换,可以让你的脚本更具灵活性。

-- 设置变量 \set myvar 'John'-- 使用变量SELECT'Hello, :myvar!'AS greeting;-- 设置变量为查询结果 \set dept_id 10SELECT*FROM employees WHERE department_id = :dept_id;

2. 执行外部脚本

你可以将复杂的 SQL 语句保存在 .sql 文件中,并通过 psql 执行。

-- 假设有一个名为 script.sql 的文件 \i /path/to/script.sql

3. 条件执行

psql 支持条件执行,这在脚本中很有用。

-- 如果表存在则删除 \if :table_exists DROPTABLE employees; \endif -- 也可以使用 \if 的更复杂形式 \if :is_dev -- 开发环境下的特定操作 \else-- 生产环境下的特定操作 \endif 

4. 错误处理

psql 提供了错误处理机制。

-- 设置在遇到错误时停止执行 \set ON_ERROR_STOP 1-- 或者设置在遇到错误时继续执行 \set ON_ERROR_STOP 0

5. 事务控制

psql 支持事务控制。

BEGIN;INSERTINTO employees (first_name, last_name, email)VALUES('David','Wilson','[email protected]');-- 检查插入是否成功SELECT*FROM employees WHERE email ='[email protected]';-- 如果一切正常,提交事务COMMIT;-- 如果有问题,回滚事务-- ROLLBACK;

6. 性能分析与查询优化

psql 提供了强大的查询分析工具。

-- 分析查询计划(不执行)EXPLAINSELECT*FROM employees WHERE department_id =10;-- 分析查询计划并执行EXPLAINANALYZESELECT*FROM employees WHERE department_id =10;-- 生成更详细的执行计划EXPLAIN(FORMAT JSON)SELECT*FROM employees WHERE department_id =10;

五、Java 代码示例:与 psql 交互 🧑‍💻

虽然 psql 是一个命令行工具,但它可以通过程序化的方式被调用,比如通过 Java 代码执行 psql 命令或连接到数据库。这里我们将展示如何通过 Java 程序调用 psql 命令行工具来执行一些操作。

1. 环境准备

确保你已经安装了 PostgreSQL,并且 psql 命令可以在你的系统路径中找到。同时,你需要一个运行中的 PostgreSQL 数据库实例。

2. 使用 ProcessBuilder 调用 psql

Java 中可以使用 ProcessBuilder 来调用外部命令。下面是一个简单的示例,展示如何通过 Java 调用 psql 来执行 SQL 查询。

importjava.io.*;importjava.nio.file.Files;importjava.nio.file.Paths;importjava.util.ArrayList;importjava.util.List;publicclassPsqlExecutor{privatestaticfinalString DB_URL ="jdbc:postgresql://localhost:5432/your_database_name";// 替换为你的数据库名privatestaticfinalString DB_USER ="your_username";// 替换为你的用户名privatestaticfinalString DB_PASSWORD ="your_password";// 替换为你的密码publicstaticvoidmain(String[] args){try{// 示例 1: 直接调用 psql 执行 SQL 查询executePsqlCommandDirectly();// 示例 2: 从文件执行 SQL 脚本executePsqlScriptFromFile();// 示例 3: 从 Java 程序中生成并执行 SQLgenerateAndExecuteSql();}catch(Exception e){ e.printStackTrace();}}/** * 示例 1: 直接调用 psql 执行 SQL 查询 */publicstaticvoidexecutePsqlCommandDirectly()throwsIOException,InterruptedException{System.out.println("\n=== 示例 1: 直接调用 psql 执行 SQL 查询 ===");// 构建 psql 命令List<String> command =newArrayList<>(); command.add("psql"); command.add("-U"); command.add(DB_USER); command.add("-d"); command.add("your_database_name");// 替换为你的数据库名 command.add("-c"); command.add("SELECT COUNT(*) FROM employees;");// 执行命令ProcessBuilder pb =newProcessBuilder(command); pb.inheritIO();// 继承标准输入输出Process process = pb.start();int exitCode = process.waitFor();System.out.println("Exit code: "+ exitCode);}/** * 示例 2: 从文件执行 SQL 脚本 */publicstaticvoidexecutePsqlScriptFromFile()throwsIOException,InterruptedException{System.out.println("\n=== 示例 2: 从文件执行 SQL 脚本 ===");// 创建一个简单的 SQL 脚本文件String scriptContent =""" -- 这是一个示例脚本 CREATE TABLE IF NOT EXISTS test_table ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); INSERT INTO test_table (name) VALUES ('Test Item 1'), ('Test Item 2'); SELECT * FROM test_table; """;String scriptPath ="test_script.sql";Files.write(Paths.get(scriptPath), scriptContent.getBytes());// 构建 psql 命令List<String> command =newArrayList<>(); command.add("psql"); command.add("-U"); command.add(DB_USER); command.add("-d"); command.add("your_database_name");// 替换为你的数据库名 command.add("-f"); command.add(scriptPath);// 执行命令ProcessBuilder pb =newProcessBuilder(command); pb.inheritIO();// 继承标准输入输出Process process = pb.start();int exitCode = process.waitFor();System.out.println("Exit code: "+ exitCode);// 清理临时文件Files.deleteIfExists(Paths.get(scriptPath));}/** * 示例 3: 从 Java 程序中生成并执行 SQL */publicstaticvoidgenerateAndExecuteSql()throwsIOException,InterruptedException{System.out.println("\n=== 示例 3: 从 Java 程序中生成并执行 SQL ===");// 生成一个动态的 SQL 查询String dynamicQuery ="SELECT * FROM employees WHERE salary > 70000 ORDER BY salary DESC LIMIT 5;";System.out.println("Generated Query: "+ dynamicQuery);// 将查询写入临时文件String tempFile ="temp_query.sql";Files.write(Paths.get(tempFile), dynamicQuery.getBytes());// 构建 psql 命令List<String> command =newArrayList<>(); command.add("psql"); command.add("-U"); command.add(DB_USER); command.add("-d"); command.add("your_database_name");// 替换为你的数据库名 command.add("-f"); command.add(tempFile);// 执行命令ProcessBuilder pb =newProcessBuilder(command); pb.inheritIO();// 继承标准输入输出Process process = pb.start();int exitCode = process.waitFor();System.out.println("Exit code: "+ exitCode);// 清理临时文件Files.deleteIfExists(Paths.get(tempFile));}}

3. 使用 JDBC 连接数据库(更推荐的方法)

虽然上面展示了如何通过 psql 命令行工具与数据库交互,但在 Java 应用程序中,通常更推荐使用 JDBC 驱动来直接连接数据库。以下是使用 JDBC 连接 PostgreSQL 并执行查询的示例。

importjava.sql.*;publicclassJdbcExample{privatestaticfinalString DB_URL ="jdbc:postgresql://localhost:5432/your_database_name";// 替换为你的数据库名privatestaticfinalString DB_USER ="your_username";// 替换为你的用户名privatestaticfinalString DB_PASSWORD ="your_password";// 替换为你的密码publicstaticvoidmain(String[] args){try{// 加载 PostgreSQL JDBC 驱动Class.forName("org.postgresql.Driver");// 建立连接try(Connection connection =DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)){System.out.println("Connected to PostgreSQL database!");// 执行查询String sql ="SELECT id, first_name, last_name, email, salary FROM employees WHERE salary > ? ORDER BY salary DESC LIMIT ?";try(PreparedStatement pstmt = connection.prepareStatement(sql)){ pstmt.setDouble(1,70000.0); pstmt.setInt(2,5);try(ResultSet rs = pstmt.executeQuery()){System.out.println("\nEmployees with salary > 70000:");System.out.println("ID\tName\t\t\tEmail\t\t\tSalary");System.out.println("----------------------------------------");while(rs.next()){int id = rs.getInt("id");String firstName = rs.getString("first_name");String lastName = rs.getString("last_name");String email = rs.getString("email");double salary = rs.getDouble("salary");System.out.printf("%d\t%s %s\t\t%s\t\t%.2f%n", id, firstName, lastName, email, salary);}}}// 执行插入String insertSql ="INSERT INTO employees (first_name, last_name, email, department_id, salary, hire_date) VALUES (?, ?, ?, ?, ?, ?)";try(PreparedStatement pstmt = connection.prepareStatement(insertSql)){ pstmt.setString(1,"Jane"); pstmt.setString(2,"Doe"); pstmt.setString(3,"[email protected]"); pstmt.setInt(4,30); pstmt.setDouble(5,72000.00); pstmt.setDate(6,java.sql.Date.valueOf("2023-04-01"));int rowsAffected = pstmt.executeUpdate();System.out.println("\nRows inserted: "+ rowsAffected);}}}catch(ClassNotFoundException|SQLException e){ e.printStackTrace();}}}

4. 注意事项

  • 安全性: 在生产环境中,避免硬编码数据库凭据。建议使用配置文件或环境变量。
  • 错误处理: 始终妥善处理 IOExceptionInterruptedException
  • 资源管理: 使用 try-with-resources 确保资源被正确关闭。
  • 权限: 确保运行 Java 程序的用户有权限执行 psql 命令。
  • 路径: 确保 psql 命令在系统路径中可用。

六、psql 的实用技巧与小贴士 🎁

1. 使用别名简化命令

你可以通过 psqlpsqlrc 文件(通常位于 ~/.psqlrc)来设置别名和自定义配置。

-- 在 ~/.psqlrc 中添加以下内容 \set HISTFILE ~/.psql_history-:DBNAME \set PROMPT1 '%n@%/%R%# ' \set ON_ERROR_STOP 1

2. 自动完成和智能提示

psql 支持自动完成,可以大大提升效率。

  • Tab 键可以自动补全命令、表名、列名等。
  • Ctrl + R 可以搜索历史命令。

3. 使用 psql 的输出格式

psql 提供了多种输出格式,可以根据需要调整。

-- 设置为 CSV 格式 \pset format csv -- 设置为 LaTeX 格式 \pset format latex -- 设置为 HTML 格式 \pset format html -- 设置为纯文本格式 \pset format unaligned -- 设置列宽 \pset columns100

4. 调整显示宽度

-- 设置每行的最大字符数 \pset width 80-- 设置列宽 \pset columns120

5. 使用 \copy 命令导入导出数据

psql 提供了 \copy 命令,可以方便地导入导出数据。

-- 导出数据到 CSV 文件 \copy (SELECT*FROM employees)TO'/tmp/employees_export.csv'WITH CSV HEADER;-- 从 CSV 文件导入数据 \copy employees FROM'/tmp/employees_export.csv'WITH CSV HEADER;

6. 使用 \timing 命令查看执行时间

-- 启用计时 \timing on-- 执行查询SELECT*FROM employees WHERE department_id =10;-- 禁用计时 \timing off

7. 优雅地处理大结果集

对于返回大量数据的查询,可以使用分页。

-- 限制结果数量SELECT*FROM employees LIMIT100OFFSET0;-- 分页查询SELECT*FROM employees LIMIT10OFFSET20;

七、常见问题与故障排除 🛠️

1. 无法连接到数据库

  • 检查网络: 确保 PostgreSQL 服务正在运行并且监听正确的端口。
  • 检查凭据: 确认用户名和密码正确。
  • 检查防火墙: 确保防火墙没有阻止连接。
  • 检查 pg_hba.conf: 确保配置允许从你的 IP 地址进行连接。

2. 权限不足

  • 检查角色: 使用 \du 查看用户角色。
  • 检查权限: 确保用户有足够的权限执行所需操作。

3. 命令未识别

  • 确认命令: 确保输入的是正确的 psql 元命令。
  • 检查拼写: 检查命令是否拼写正确。
  • 使用 \?: 输入 \? 查看所有可用的元命令。

4. 输出格式混乱

  • 检查设置: 使用 \pset 命令检查输出格式设置。
  • 调整列宽: 使用 \pset columns 调整列宽。

5. 性能问题

  • 分析查询: 使用 EXPLAINEXPLAIN ANALYZE 分析查询计划。
  • 检查索引: 确保相关列上有适当的索引。
  • 调整参数: 调整 PostgreSQL 的配置参数。

八、性能优化与监控技巧 🔍

1. 使用 EXPLAINEXPLAIN ANALYZE

这是优化查询性能的核心工具。

-- 查看查询计划(不执行)EXPLAINSELECT*FROM employees WHERE department_id =10;-- 查看查询计划并执行EXPLAINANALYZESELECT*FROM employees WHERE department_id =10;

2. 监控活动连接

-- 查看当前活动的连接SELECT pid, usename, application_name, client_addr, client_port, state, query FROM pg_stat_activity WHERE state ='active';

3. 监控慢查询

-- 查看最近的慢查询SELECT query, calls, total_time, mean_time FROM pg_stat_statements ORDERBY total_time DESCLIMIT10;

九、高级主题:脚本化与自动化 🔄

1. 编写复杂的 psql 脚本

你可以创建复杂的脚本来执行一系列操作。

-- example_script.sql \echo 'Starting database maintenance...' \set ON_ERROR_STOP 1-- 创建备份表CREATETABLEIFNOTEXISTS employees_backup ASSELECT*FROM employees;-- 更新员工薪资UPDATE employees SET salary = salary *1.05WHERE department_id =10;-- 记录更新INSERTINTO audit_log (action, table_name,timestamp)VALUES('SALARY_UPDATE','employees',NOW()); \echo 'Maintenance completed successfully.'

然后执行:

psql -U myuser -d mydb -f example_script.sql 

2. 使用环境变量

在脚本中使用环境变量可以提高灵活性。

-- 使用环境变量 \set env_db_name :DB_NAME \set env_user_name :DB_USER -- 然后在查询中使用SELECT*FROM :env_db_name WHEREuser= :env_user_name;

十、总结与展望 🌟

通过本文的学习,你应该对 PostgreSQL 的 psql 命令行工具有了全面而深入的认识。从基础的连接、执行 SQL 命令,到高级的脚本化、性能优化,再到与 Java 程序的交互,psql 都展现了其强大的功能和灵活性。

掌握 psql 不仅能提升你在 PostgreSQL 环境中的工作效率,还能帮助你更好地理解和诊断数据库问题。无论是作为 DBA 还是开发者,熟练运用 psql 都是一项重要的技能。

未来,随着 PostgreSQL 的不断发展,psql 也会持续增强其功能,提供更多便利的交互特性。保持学习和探索的态度,将使你在 PostgreSQL 的道路上走得更远。


参考资料:

Mermaid 图表:psql 主要功能概览

psql Command Line Tool

Connection Management

SQL Execution

Meta-Commands

Output Formatting

Scripting & Automation

Performance Analysis

Connect to Database

Switch Databases

View Connection Info

Execute SQL Statements

Multi-line Input

Variable Substitution

Show Tables

Show Indexes

Show Functions

Show Users

Execute Scripts

Text Format

CSV Format

HTML Format

LaTeX Format

Execute SQL Files

Conditional Execution

Error Handling

Transaction Control

EXPLAIN

EXPLAIN ANALYZE

Query Statistics

Mermaid 图表:psql 常用快捷键

Keyboard Shortcuts

Line Navigation

History Management

Editing

Completion

Ctrl+A

Move to Beginning of Line

Ctrl+E

Move to End of Line

Up Arrow

Previous Command

Down Arrow

Next Command

Ctrl+R

Search History Forward

Ctrl+S

Search History Backward

Ctrl+U

Clear Line

Ctrl+K

Clear to End of Line

Ctrl+W

Delete Previous Word

Tab

Auto Complete

希望这篇文章能为你提供清晰、实用的指导,让你在 PostgreSQL 的 psql 命令行工具使用上更加得心应手!🌟


🙌 感谢你读到这里!
🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
💡 如果本文对你有帮助,不妨 👍 点赞、📌 收藏、📤 分享 给更多需要的朋友!
💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿
🔔 关注我,不错过下一篇干货!我们下期再见!✨

Read more

Flutter for OpenHarmony: Flutter 三方库 http_interceptor 让官方 http 请求具备全链路拦截能力(网络层架构增强)

Flutter for OpenHarmony: Flutter 三方库 http_interceptor 让官方 http 请求具备全链路拦截能力(网络层架构增强)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 应用开发时,很多开发者喜欢直接使用官方提供的 http 软件包,因其小巧且兼容性极佳。然而,官方库的一个痛点是:它缺乏原生的拦截器(Interceptor)机制。当我们需要为所有请求统一添加 Authorization Header,或者需要全局捕获 401 错误码时,不得不对每个请求函数进行手动封装。 http_interceptor 的出现完美解决了这个问题。它通过 AOP(切面)的思想,在不破坏官方库原有接口的前提下,为你的鸿蒙网络请求链路增加了强大的“前哨”和“后哨”,是构建标准化鸿蒙网络层的关键插件。 一、请求/响应拦截器链模型 http_interceptor 在请求发出前和响应返回后建立了两道关卡。 鸿蒙 App 业务调用 Request Interceptor (注入

By Ne0inhk
Spring Boot集成华为云OBS实现文件上传与预览功能(含安全下载)

Spring Boot集成华为云OBS实现文件上传与预览功能(含安全下载)

Spring Boot集成华为云OBS实现文件上传与预览功能(含安全下载) 本文基于Spring Boot + 华为云OBS(对象存储服务)实现一套完整的文件上传、预签名URL生成、安全预览/下载功能,并附带详细代码解析,适用于企业级应用中的文档管理、图片存储等场景。 一、背景与需求 在现代Web应用中,文件上传与访问是常见需求。出于安全性考虑,我们通常将文件存储在私有桶(Private Bucket)中,禁止直接公开访问。此时,需要通过预签名URL(Presigned URL) 机制临时授权用户访问特定文件。 本文将演示如何: * 配置华为云OBS连接 * 限制上传文件类型 * 将文件上传至OBS并记录元数据 * 生成1小时有效的预签名URL用于前端预览或下载 * 提供后端代理式文件预览接口(解决跨域、权限控制等问题) 二、项目结构概览 com.hrm.rmhr ├── config │ └── ObsConfig.java // OBS配置类 ├── controller │ └── FileController.java // 文件上传、

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 ferry 在鸿蒙应用中构建高性能类型安全的 GraphQL 通讯架构(现代 API 调用方案)

Flutter for OpenHarmony: Flutter 三方库 ferry 在鸿蒙应用中构建高性能类型安全的 GraphQL 通讯架构(现代 API 调用方案)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 随着后端架构的演进,越来越多的 OpenHarmony 项目开始采用 GraphQL 替代传统的 RESTful API。GraphQL 的优势在于“按需取值”,能有效减少冗余数据的传输,这对于追求极致性能的鸿蒙应用尤为重要。然而,手动拼接 GraphQL 字符串、解析动态 Map 依然是繁琐且易错的。 ferry 是一套为 Flutter 量身定制的 GraphQL 客户端全家桶。它通过深度集成代码生成器(Code Generation),让你的鸿蒙应用能以“强类型”方式操作查询。它不仅支持请求与变动,更内置了极致的规范化缓存(Normalized Cache)系统,是构建专业级鸿蒙 GraphQL 应用的终极武器。 一、类型全链路通讯架构 ferry 在本地定义与远程数据之间建立了强类型的映射隧道。

By Ne0inhk
Node.js 安装指南(Mac 版本)

Node.js 安装指南(Mac 版本)

目录 第一章 准备工作与环境检查 1.1 确认系统要求在开始安装 Node.js 之前,首先需要确认您的 Mac 系统是否符合要求: 1.2 检查现有 Node.js 安装 1.3 备份重要数据 1.4 清理可能的旧版本 第二章:安装方法概述与选择 2.1 主要安装方法比较 2.2 推荐安装方案 第三章:方法一 - 使用官方安装包 3.1 下载官方安装包 3.2 安装过程详解 3.3 验证安装 安装过程中遇到问题: 🧐 为什么会出现这个错误? ✅ 如何解决? 方案一:使用

By Ne0inhk