PostgreSQL教程FG126-psql客户端高级用法:命令行技巧与脚本化
本文档风哥主要介绍PostgreSQL的psql客户端高级用法,包括命令行技巧、脚本化、自动化等内容,风哥教程参考PostgreSQL官方文档psql内容,适合DBA和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 psql客户端概述
psql是PostgreSQL的命令行交互式终端,是PostgreSQL自带的官方客户端工具,用于连接PostgreSQL数据库并执行SQL语句、管理数据库对象等。更多视频教程www.fgedu.net.cn
- 执行SQL语句
- 管理数据库对象
- 执行脚本文件
- 生成报表
- 执行维护操作
- 监控数据库状态
1.2 psql客户端特性
psql的主要特性:
- 交互式命令行:支持命令历史、自动补全等功能
- 脚本执行:可以执行SQL脚本文件
- 元命令:提供大量以反斜杠开头的元命令
- 格式化输出:支持多种输出格式
- 变量支持:支持定义和使用变量
- 事务支持:可以管理事务
- 管道支持:可以与其他命令通过管道交互
- 跨平台:支持多种操作系统
1.3 psql客户端架构
psql的架构:
- 命令行界面:处理用户输入和显示输出
- SQL解析器:解析和执行SQL语句
- 元命令处理器:处理psql特有的元命令
- libpq接口:与PostgreSQL服务器通信
- 格式化引擎:处理查询结果的格式化
Part02-生产环境规划与建议
2.1 psql客户端安装
psql客户端的安装方法:
# 基于RPM的系统(如Oracle Linux、RHEL、CentOS)
$ sudo dnf install postgresql
# 基于DEB的系统(如Ubuntu、Debian)
$ sudo apt-get install postgresql-client
# 在macOS上安装psql
$ brew install postgresql
# 在Windows上安装psql
# 从PostgreSQL官网下载Windows安装包,选择安装”Command Line Tools”
# 验证psql是否安装成功
$ psql –version
psql (PostgreSQL) 15.0
# 查看psql的帮助信息
$ psql –help
2.2 psql客户端配置
psql的配置文件:
from oracle:www.itpux.com
# 系统级配置文件
$ cat /etc/postgresql-common/pg_service.conf
# 用户级配置文件
$ cat ~/.psqlrc
# 环境变量配置
$ echo $PGDATABASE
$ echo $PGUSER
$ echo $PGPASSWORD
$ echo $PGHOST
$ echo $PGPORT
# 示例:在~/.psqlrc中添加常用设置
$ vi ~/.psqlrc
— 设置输出格式
\pset format aligned
\pset linestyle unicode
\pset border 2
\pset footer on
— 设置提示符
\set PROMPT1 ‘%n@%M:%>%/# ‘
\set PROMPT2 ‘%n@%M:%>%/-> ‘
— 导入常用函数
\i ~/.psql_functions.sql
— 设置别名
\set dbstats ‘SELECT datname, pg_size_pretty(pg_fgedudb_size(datname)) FROM pg_fgedudb;’
— 显示连接信息
\conninfo
2.3 psql客户端最佳实践
psql的使用最佳实践:
- 使用环境变量:设置PGDATABASE、PGUSER等环境变量,减少连接参数
- 配置~/.psqlrc:自定义psql的行为和外观
- 使用元命令:熟悉常用的元命令,提高操作效率
- 脚本化:将常用操作编写为脚本,实现自动化
- 参数化查询:使用参数化查询,避免SQL注入
- 错误处理:妥善处理SQL执行过程中的错误
- 输出格式化:根据需要选择合适的输出格式
- 事务管理:合理使用事务,确保数据一致性
Part03-生产环境项目实施方案
3.1 psql命令行技巧
3.1.1 连接数据库
# 1. 基本连接
$ psql -h localfgedu.net.cn -p 5432 -U pgsql -d fgedudb
# 2. 使用环境变量
$ export PGDATABASE=fgedudb
$ export PGUSER=pgsql $ export PGHOST=localfgedu.net.cn
$ export PGPORT=5432
$ psql
# 3. 使用URL
$ psql postgresql://pgsql: postgres_password@localfgedu.net.cn:5432/fgedudb
# 4. 使用服务文件
$ psql service=my_service
# 5. 连接到默认数据库
$ psql
# 6. 连接后切换数据库
postgres=# \c fgedudb
You are now connected to fgedudb “fgedudb” as fgedu “postgres”.
3.1.2 元命令使用
# 1. 帮助信息
postgres=# \?
# 2. 连接信息
postgres=# \conninfo
You are connected to fgedudb “fgedudb” as fgedu “postgres” via socket in “/var/run/postgresql” at port “5432”.
# 3. 列出数据库
postgres=# \l
List of fgedudbs
Name | Owner | Encoding | Collate | Ctype | Access privileges
———–+———-+———-+———+———+———————–
fgedudb | pgsql | UTF8 | C.UTF-8 | C.UTF-8 |
pgsql | pgsql | UTF8 | C.UTF-8 | C.UTF-8 |
template0 | pgsql | UTF8 | C.UTF-8 | C.UTF-8 | =c/pgsql +
| | | | | postgres=CTc/pgsql template1 | pgsql | UTF8 | C.UTF-8 | C.UTF-8 | =c/pgsql +
| | | | | postgres=CTc/pgsql (4 rows)
# 4. 列出表
fgedudb=# \dt
List of relations
Schema | Name | Type | Owner
——–+————–+——-+———-
public | fgedu_employees | table | pgsql (1 row)
# 5. 查看表结构
fgedudb=# \d fgedu_employees
Table “public.fgedu_employees”
Column | Type | Collation | Nullable | Default
——–+————————+———–+———-+———————————-
id | integer | | not null | nextval(‘fgedu_employees_id_seq’::regclass)
name | character varying(100) | | not null |
age | integer | | not null |
Indexes:
“fgedu_employees_pkey” PRIMARY KEY, btree (id)
# 6. 查看索引
fgedudb=# \di
List of relations
Schema | Name | Type | Owner | Table
——–+————————-+——-+———-+—————-
public | fgedu_employees_pkey | index | pgsql | fgedu_employees
(1 row)
# 7. 查看函数
fgedudb=# \df
# 8. 查看视图
fgedudb=# \dv
# 9. 查看序列
fgedudb=# \ds
# 10. 查看表空间
fgedudb=# \db
# 11. 查看用户
fgedudb=# \du
# 12. 执行外部文件
fgedudb=# \i script.sql
# 13. 保存查询结果到文件
fgedudb=# \o output.txt
fgedudb=# SELECT * FROM fgedu_employees;
fgedudb=# \o
# 14. 设置输出格式
fgedudb=# \pset format csv
Output format is csv.
fgedudb=# \pset format aligned
Output format is aligned.
# 15. 查看系统信息
fgedudb=# \l+ # 详细列出数据库
fgedudb=# \dt+ # 详细列出表
fgedudb=# \d+ # 详细查看表结构
3.1.3 命令行选项
# 1. 执行SQL语句
$ psql -c “SELECT * FROM fgedu_employees;”
fgedudb=# SELECT * FROM fgedu_employees;
id | name | age
—-+——+—–
1 | 风哥1号 | 25
2 | 风哥2号 | 30
(2 rows)
# 2. 执行脚本文件
$ psql -f script.sql
# 3. 输出为CSV格式
$ psql -c “SELECT * FROM fgedu_employees;” -A -F,
1,风哥1号,25
2,风哥2号,30
# 4. 输出为HTML格式
$ psql -c “SELECT * FROM fgedu_employees;” -H
# 5. 输出为LaTeX格式
$ psql -c “SELECT * FROM fgedu_employees;” -L
# 6. 显示执行时间
$ psql -c “\timing on; SELECT * FROM fgedu_employees;”
Timing is on.
id | name | age
—-+——+—–
1 | 风哥1号 | 25
2 | 风哥2号 | 30
(2 rows)
Time: 0.583 ms
# 7. 静默模式
$ psql -q -c “SELECT * FROM fgedu_employees;”
# 8. 变量替换
$ psql -v name=’风哥1号’ -c “SELECT * FROM fgedu_employees WHERE name = :name;”
id | name | age
—-+——+—–
1 | 风哥1号 | 25
(1 row)
# 9. 多行输入
$ psql << EOF
> SELECT * FROM fgedu_employees;
> EOF
id | name | age
—-+——+—–
1 | 风哥1号 | 25
2 | 风哥2号 | 30
(2 rows)
3.2 psql脚本化
3.2.1 基本脚本
# 创建脚本文件
$ vi create_table.sql
— 创建表
CREATE TABLE fgedu_IF NOT EXISTS fgedu_employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER NOT NULL,
department VARCHAR(100) NOT NULL
);
— 插入数据
INSERT INTO fgedu_employees (name, age, department) VALUES
(‘风哥1号’, 25, ‘技术部’),
(‘风哥2号’, 30, ‘市场部’),
(‘王五’, 35, ‘财务部’);
— 查询数据
SELECT * FROM fgedu_employees;
# 执行脚本
$ psql -f create_table.sql
CREATE TABLE fgedu_INSERT 0 3
id | name | age | department
—-+——+—–+————
1 | 风哥1号 | 25 | 技术部
2 | 风哥2号 | 30 | 市场部
3 | 王五 | 35 | 财务部
(3 rows)
3.2.2 变量使用
# 创建带变量的脚本
$ vi variable_example.sql
— 定义变量
\set department ‘技术部’
\set min_age 25
— 使用变量
SELECT * FROM fgedu_employees
WHERE department = :’department’
AND age >= :min_age;
# 执行脚本
$ psql -f variable_example.sql
id | name | age | department
—-+——+—–+————
1 | 风哥1号 | 25 | 技术部
(1 row)
# 从命令行传递变量
$ psql -v department=’市场部’ -v min_age=28 -f variable_example.sql
id | name | age | department
—-+——+—–+————
2 | 风哥2号 | 30 | 市场部
(1 row)
3.2.3 条件语句
# 创建带条件的脚本
$ vi condition_example.sql
— 检查表是否存在
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.tables
WHERE table_name = ‘fgedu_employees’
) THEN
RAISE NOTICE ‘表fgedu_employees已存在’;
ELSE
RAISE NOTICE ‘表fgedu_employees不存在,正在创建…’;
CREATE TABLE fgedu_employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER NOT NULL
);
END IF;
END $$;
# 执行脚本
$ psql -f condition_example.sql
NOTICE: 表fgedu_employees已存在
DO
3.3 psql自动化
3.3.1 批处理脚本
# 创建批处理脚本
$ vi batch_script.sh
#!/bin/bash
# batch_script.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# web: http://www.fgedu.net.cn
# 连接参数
HOST=”localfgedu.net.cn”
PORT=”5432″
USER=”pgsql”
DBNAME=”fgedudb”
# 执行SQL语句
psql -h “$HOST” -p “$PORT” -U “$USER” -d “$DBNAME” -c “\timing on”
# 执行多个SQL语句
psql -h “$HOST” -p “$PORT” -U “$USER” -d “$DBNAME” << EOF
-- 查看数据库大小
SELECT datname, pg_size_pretty(pg_fgedudb_size(datname)) FROM pg_fgedudb;
-- 查看表大小
SELECT table_name, pg_size_pretty(pg_table_size(table_name))
FROM information_schema.tables
WHERE table_schema = 'public';
-- 查看索引大小
SELECT indexname, pg_size_pretty(pg_indexes_size(indexrelid))
FROM pg_indexes
WHERE schemaname = 'public';
EOF
# 执行脚本
$ chmod +x batch_script.sh
$ ./batch_script.sh
Timing is on.
datname | pg_size_pretty
----------+----------------
fgedudb | 8.4 MB
pgsql | 8.4 MB
template0 | 8.3 MB
template1 | 8.3 MB
(4 rows)
Time: 1.234 ms
table_name | pg_size_pretty
-----------------------+----------------
fgedu_employees | 16 kB
(1 row)
Time: 0.987 ms
indexname | pg_size_pretty
-----------------------+----------------
fgedu_employees_pkey | 16 kB
(1 row)
Time: 0.876 ms
3.3.2 定时任务
# 创建定时任务脚本
$ vi pg_backup.sh
#!/bin/bash
# pg_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# web: http://www.fgedu.net.cn
# 连接参数
HOST=”localfgedu.net.cn”
PORT=”5432″
USER=”pgsql”
DBNAME=”fgedudb”
# 备份目录
BACKUP_DIR=”/postgresql/backup”
DATE=$(date +”%Y%m%d_%H%M%S”)
BACKUP_FILE=”${BACKUP_DIR}/fgedudb_${DATE}.sql”
# 创建备份目录
mkdir -p “$BACKUP_DIR”
# 执行备份
pg_dump -h “$HOST” -p “$PORT” -U “$USER” -d “$DBNAME” -F p -f “$BACKUP_FILE”
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo “备份成功: $BACKUP_FILE”
# 压缩备份文件
gzip “$BACKUP_FILE”
echo “备份文件已压缩: ${BACKUP_FILE}.gz”
# 删除7天前的备份
find “$BACKUP_DIR” -name “*.gz” -mtime +7 -delete
echo “已删除7天前的备份文件”
else
echo “备份失败”
fi
# 添加到crontab
$ crontab -e
# 每天凌晨2点执行备份
0 2 * * * /path/to/pg_backup.sh >> /path/to/pg_backup.log 2>&1
# 查看crontab
$ crontab -l
Part04-生产案例与实战讲解
4.1 psql常见问题
在使用psql时,可能会遇到以下问题:
4.1.1 连接问题
# 错误信息
$ psql -h localfgedu.net.cn -p 5432 -U pgsql -d fgedudb
psql: error: connection to server at “localfgedu.net.cn” (::1), port 5432 failed: Connection refused
Is the server running on that fgedu.net.cn and accepting TCP/IP connections?
# 原因:PostgreSQL服务器未运行或未监听指定端口
# 解决方案:
# 检查PostgreSQL服务状态
$ sudo systemctl status postgresql
# 启动PostgreSQL服务
$ sudo systemctl start postgresql
# 问题2:密码认证失败
# 错误信息
$ psql -h localfgedu.net.cn -p 5432 -U pgsql -d fgedudb
psql: error: connection to server at “localfgedu.net.cn” (::1), port 5432 failed: FATAL: password authentication failed for fgedu “postgres”
# 原因:密码错误或认证方式不正确
# 解决方案:
# 检查pg_hba.conf文件
$ sudo vi /postgresql/data/pg_hba.conf
# 重置密码
$ sudo -u pgsql psql -c “ALTER USER pgsql WITH PASSWORD ‘new_password’;”
4.1.2 执行问题
# 错误信息
fgedudb=# SELECT * FROM non_existent_table;
ERROR: relation “non_existent_table” does not exist
LINE 1: SELECT * FROM non_existent_table;
^
# 原因:表不存在
# 解决方案:检查表名是否正确,或创建表
# 问题2:权限不足
# 错误信息
fgedudb=# CREATE TABLE fgedu_test_table (id SERIAL PRIMARY KEY);
ERROR: permission denied for schema public
# 原因:用户没有在public模式下创建表的权限
# 解决方案:授予权限
postgres=# GRANT CREATE ON SCHEMA public TO fgedu_name;
4.2 psql问题解决方案
# 1. 连接问题
## 问题:连接超时
## 解决方案:
– 检查网络连接
– 检查PostgreSQL服务器是否运行
– 检查防火墙设置
– 检查pg_hba.conf文件配置
## 问题:认证失败
## 解决方案:
– 检查用户名和密码
– 检查pg_hba.conf文件中的认证方式
– 重置用户密码
– 检查用户是否存在
# 2. 执行问题
## 问题:SQL语法错误
## 解决方案:
– 检查SQL语句语法
– 检查表和列名是否正确
– 使用psql的自动补全功能
– 参考PostgreSQL文档
## 问题:权限不足
## 解决方案:
– 检查用户权限
– 授予必要的权限
– 使用超级用户执行需要权限的操作
– 检查对象所有权
# 3. 性能问题
## 问题:查询速度慢
## 解决方案:
– 优化SQL语句
– 使用索引
– 分析执行计划
– 调整PostgreSQL参数
## 问题:内存使用高
## 解决方案:
– 调整psql的内存设置
– 使用 LIMIT 子句限制结果集大小
– 优化查询
– 增加服务器内存
# 4. 脚本问题
## 问题:脚本执行失败
## 解决方案:
– 检查脚本语法
– 检查连接参数
– 检查错误信息
– 逐步执行脚本,定位问题
## 问题:变量替换失败
## 解决方案:
– 检查变量格式
– 使用正确的变量引用方式
– 确保变量已定义
4.3 psql实战案例
# 1. 创建维护脚本
$ vi pg_maintenance.sh
#!/bin/bash
# pg_maintenance.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# web: http://www.fgedu.net.cn
# 连接参数
HOST=”localfgedu.net.cn”
PORT=”5432″
USER=”pgsql”
DBNAME=”fgedudb”
# 日志文件
LOG_FILE=”/var/log/postgresql/maintenance.log”
# 开始维护
echo “$(date): 开始数据库维护” >> “$LOG_FILE”
# 执行VACUUM
psql -h “$HOST” -p “$PORT” -U “$USER” -d “$DBNAME” -c “VACUUM ANALYZE;” >> “$LOG_FILE” 2>&1
if [ $? -eq 0 ]; then
echo “$(date): VACUUM ANALYZE执行成功” >> “$LOG_FILE”
else
echo “$(date): VACUUM ANALYZE执行失败” >> “$LOG_FILE”
fi
# 检查数据库大小
psql -h “$HOST” -p “$PORT” -U “$USER” -d “$DBNAME” -c “\l+” >> “$LOG_FILE” 2>&1
# 检查表大小
psql -h “$HOST” -p “$PORT” -U “$USER” -d “$DBNAME” -c “SELECT table_name, pg_size_pretty(pg_table_size(table_name)) FROM information_schema.tables WHERE table_schema = ‘public’;” >> “$LOG_FILE” 2>&1
# 检查索引大小
psql -h “$HOST” -p “$PORT” -U “$USER” -d “$DBNAME” -c “SELECT indexname, pg_size_pretty(pg_indexes_size(indexrelid)) FROM pg_indexes WHERE schemaname = ‘public’;” >> “$LOG_FILE” 2>&1
# 检查连接数
psql -h “$HOST” -p “$PORT” -U “$USER” -d “$DBNAME” -c “SELECT count(*) FROM pg_stat_activity;” >> “$LOG_FILE” 2>&1
# 检查锁
psql -h “$HOST” -p “$PORT” -U “$USER” -d “$DBNAME” -c “SELECT * FROM pg_locks WHERE NOT granted;” >> “$LOG_FILE” 2>&1
# 结束维护
echo “$(date): 数据库维护完成” >> “$LOG_FILE”
echo “———————————-” >> “$LOG_FILE”
# 2. 执行维护脚本
$ chmod +x pg_maintenance.sh
$ ./pg_maintenance.sh
# 3. 查看日志
$ cat /var/log/postgresql/maintenance.log
2026-04-02 10:00:00: 开始数据库维护
2026-04-02 10:00:01: VACUUM ANALYZE执行成功
List of fgedudbs
Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description
———–+———-+———-+———+———+———————–+———+————+——————————————–
fgedudb | pgsql | UTF8 | C.UTF-8 | C.UTF-8 | | 8.4 MB | pg_default |
pgsql | pgsql | UTF8 | C.UTF-8 | C.UTF-8 | | 8.4 MB | pg_default | default administrative connection fgedudb
template0 | pgsql | UTF8 | C.UTF-8 | C.UTF-8 | =c/pgsql +| 8.3 MB | pg_default | unmodifiable empty fgedudb
| | | | | postgres=CTc/pgsql | | |
template1 | pgsql | UTF8 | C.UTF-8 | C.UTF-8 | =c/pgsql +| 8.3 MB | pg_default | default template for new fgedudbs
| | | | | postgres=CTc/pgsql | | |
(4 rows)
table_name | pg_size_pretty
———————–+—————-
fgedu_employees | 16 kB
(1 row)
indexname | pg_size_pretty
———————–+—————-
fgedu_employees_pkey | 16 kB
(1 row)
count
——-
1
(1 row)
2026-04-02 10:00:05: 数据库维护完成
———————————-
# 4. 添加到crontab
$ crontab -e
# 每天凌晨3点执行维护
0 3 * * * /path/to/pg_maintenance.sh
Part05-风哥经验总结与分享
5.1 psql使用技巧
psql使用技巧:
- 使用\?查看帮助:了解所有可用的元命令
- 使用\timing开启计时:查看SQL语句的执行时间
- 使用\x开启扩展显示:更清晰地查看复杂结果
- 使用\set定义变量:方便在多个SQL语句中重复使用
- 使用\i执行脚本:执行外部SQL脚本文件
- 使用\o重定向输出:将查询结果保存到文件
- 使用\watch定时执行:定期执行查询并显示结果
- 使用\conninfo查看连接信息:确认当前连接状态
- 使用\l+查看数据库详情:包括大小、表空间等信息
- 使用\dt+查看表详情:包括大小、行数等信息
- 使用\d+查看对象详情:包括结构、索引等信息
- 使用\df+查看函数详情:包括参数、返回类型等信息
- 使用\du+查看用户详情:包括权限、角色等信息
- 使用\dn+查看模式详情:包括权限、所有者等信息
- 使用\db+查看表空间详情:包括大小、位置等信息
5.2 psql性能优化
# 1. 连接优化
– 使用Unix套接字连接:比TCP/IP连接更快
– 重用连接:避免频繁建立和关闭连接
– 使用连接池:如PgBouncer
– 减少连接参数:使用环境变量或服务文件
# 2. 查询优化
– 使用\timing分析查询时间
– 使用EXPLAIN分析执行计划
– 优化SQL语句:使用索引、避免全表扫描
– 限制结果集大小:使用LIMIT子句
– 批量操作:减少网络往返
# 3. 输出优化
– 使用适当的输出格式:如\pset format aligned
– 减少输出列数:只选择需要的列
– 压缩输出:使用gzip等工具
– 重定向输出到文件:避免终端显示开销
# 4. 脚本优化
– 使用事务:减少提交次数
– 批量执行:减少网络往返
– 错误处理:妥善处理错误
– 日志记录:记录执行过程和结果
– 并行执行:使用shell的并行功能
# 5. 系统优化
– 增加psql的内存限制:设置PGOPTIONS
– 调整操作系统参数:如TCP缓冲区大小
– 使用SSD存储:提高I/O性能
– 增加网络带宽:减少网络延迟
5.3 psql资源与工具
psql相关资源与工具:
- PostgreSQL官方文档:https://www.postgresql.org/docs/current/fgapp-psql.html
- psql手册页:man psql
- PostgreSQL社区:https://www.postgresql.org/community/
- Stack Overflow:搜索psql相关问题
- GitHub:查找psql相关工具和脚本
- psql提示与技巧:https://wiki.postgresql.org/wiki/PsqlTips
- psqlrc示例:https://github.com/jbranchaud/dotfiles/blob/master/.psqlrc
- pgcli:增强版psql客户端,提供更好的自动补全和语法高亮
- psql2csv:将psql输出转换为CSV格式的工具
- psql-scripts:各种psql脚本集合
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
