本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:DevArt 提供了 dbExpress 驱动程序,用于连接 PostgreSQL 数据库,简化了开发者的数据库操作。该驱动集成了 dbExpress 框架,支持多种数据库操作功能,如连接、查询和事务处理。包含了源代码,为开发者提供了灵活性和定制能力。使用前需确保安装了 dbExpress 框架,并正确配置数据库访问权限。 DevArt.dbExpress driver for PostgreSQL Standard-2.1.2(16-Dec-2011)+ Source Code(ALL-IN-ONE).7z

1. PostgreSQL dbExpress 驱动程序介绍

PostgreSQL dbExpress 驱动程序是为Delphi和C++Builder开发者提供的一种高效方式,用于访问PostgreSQL数据库。作为dbExpress框架的一部分,该驱动程序不仅提供了快速的数据库连接,还具有小型、高效的特点,使得开发者能够快速开发数据库应用程序。通过支持dbExpress驱动程序,开发者可以利用它简洁的接口、多平台支持和高执行效率,简化数据库相关的编程工作。本文将深入探讨该驱动程序的基本概念、安装配置以及如何在日常开发中发挥作用。

2. PostgreSQL 数据库特性概述

2.1 PostgreSQL 数据库核心特性

PostgreSQL 是一个功能强大的开源对象关系数据库系统(ORDBMS),其具备的特性使其在 IT 领域享有盛誉。了解这些核心特性对于开发人员和数据库管理员而言至关重要,因为它们能够确保开发流程的顺畅及数据库的安全稳定运行。

2.1.1 数据库架构和存储机制

PostgreSQL 的架构设计是高度模块化的,它支持各种存储机制。它的核心是关系数据库管理系统,但还能通过扩展类型、操作符、函数和索引来支持复杂的对象类型。表、视图和索引都存储为关系,而二进制大对象(BLOBs)则存储为文件系统中的文件。这种存储机制不仅增强了存储的灵活性,同时也让数据库对大数据量的处理变得更加高效。

在这个子章节中,我们要详细地了解 Postgres 数据库的存储机制,如表空间的使用方法以及数据存储的内部工作机制。表空间允许数据库管理员对不同的数据文件放置在不同的文件系统上,从而优化I/O性能,或者进行有效的数据备份。进一步了解表空间,我们将通过以下命令创建一个新表空间:

CREATE TABLESPACE new_tablespace LOCATION '/mnt/data';

这里, new_tablespace 是我们定义的新表空间名称,而 /mnt/data 是希望放置数据文件的目录。执行完这条命令后,我们就可以通过指定表空间来创建新表:

CREATE TABLE my_table ( id SERIAL, data TEXT ) TABLESPACE new_tablespace;

在创建表的时候,通过 TABLESPACE new_tablespace 指定使用之前创建的表空间,使得数据的物理存储位置得到控制。

2.1.2 事务处理和并发控制

PostgreSQL 支持高级事务控制,包括 ACID 特性(原子性、一致性、隔离性、持久性),这是进行可靠数据操作的基石。它通过多版本并发控制(MVCC)机制实现事务,允许数据库同时处理多个事务而不互相干扰。

MVCC 对于理解如何在 Postgres 中高效地管理并发读写操作至关重要。每个事务都是在它自己的快照中运行,这个快照是事务开始时数据库状态的副本,使得事务无需锁定表来保证数据一致性。

为了演示事务的使用,下面是一段示例代码:

BEGIN; -- 开始一个事务

INSERT INTO my_table (data) VALUES ('New Data');

-- 在这里可以进行更多的操作...

COMMIT; -- 提交事务

在这个例子中,我们将一系列操作封装在一个事务里。如果在执行中遇到任何问题,可以执行 ROLLBACK; 命令来回滚所有更改。

2.2 PostgreSQL 的扩展功能

PostgreSQL 的扩展功能进一步增强了它的核心能力,使其能够满足各种复杂应用场景的需求。

2.2.1 索引和查询优化技术

索引在数据库查询性能优化中发挥着重要作用。PostgreSQL 提供了多种索引类型,如 B-tree、hash、GiST 和 GIN。这些索引类型各有其适用场景,例如 B-tree 适用于范围查询,而 GiST 和 GIN 索引则适用于全文搜索和复杂查询模式匹配。

下面是一个创建 B-tree 索引的示例:

CREATE INDEX idx_my_table_data ON my_table(data);

为了进一步展示索引优化技术,在我们执行查询时,使用 EXPLAIN 命令分析查询计划:

EXPLAIN SELECT * FROM my_table WHERE data = 'Some data';

查询计划将提供关于如何使用索引来执行查询的详细信息,比如是否是全表扫描,或者是否使用了我们创建的索引。

2.2.2 触发器、函数和存储过程

PostgreSQL 还提供了强大的编程特性,包括创建触发器、自定义函数和存储过程的能力。这些特性让开发者能够编写复杂的业务逻辑代码,直接嵌入到数据库服务器中执行。

为了演示如何创建一个简单的函数,我们使用下面的代码:

CREATE OR REPLACE FUNCTION add_data(value TEXT) RETURNS VOID AS $$
BEGIN
  INSERT INTO my_table (data) VALUES (value);
END;
$$ LANGUAGE plpgsql;

这个函数 add_data 接受一个文本类型的参数,并将新数据插入到表中。函数的编写使用了 PL/pgSQL 编程语言,这是一种过程式语言,提供了条件判断、循环等控制语句。

在实际使用中,我们可以通过调用此函数来插入数据:

SELECT add_data('New Data');

请注意,此函数的实现是在数据库服务器层面进行的,因此它能够提供比应用程序层面更高效的执行性能。这种接近数据的执行方式尤其在处理大量数据时,能显著减少网络开销和提高数据处理速度。

3. Delphi 和 C++Builder 开发者使用说明

Delphi 和 C++Builder 是在 Windows 平台上广泛使用的集成开发环境(IDE),它们为开发者提供了丰富高效的功能,以构建面向对象的应用程序。本章节将深入讲解如何为这两种开发环境配置 PostgreSQL dbExpress 驱动程序,以及如何使用它来访问 PostgreSQL 数据库。

3.1 开发环境搭建

3.1.1 Delphi/C++Builder版本兼容性

在开始之前,了解你的 Delphi 或 C++Builder 版本与 PostgreSQL dbExpress 驱动程序的兼容性是至关重要的。根据不同的版本,IDE 中对 PostgreSQL 的支持也有所不同。较新的 Delphi 版本(例如10.4 Sydney和更新版本)对 PostgreSQL 有更好的支持。此外,对于 C++Builder,目前稳定支持的版本至少应为10.4.1版本。较老的版本可能需要通过第三方库或插件来访问 PostgreSQL 数据库。

3.1.2 IDE集成与项目配置

一旦确保了版本兼容性,下一步是将 PostgreSQL dbExpress 驱动程序集成到你的开发环境中。这通常涉及到配置 IDE 以识别新的数据访问组件,并更新项目以包含适当的库和组件。

在 Delphi 中,你可以在工具选项(Tools > Options)中添加 dbExpress 驱动程序的路径,以便 IDE 能够识别 dbExpress 组件。对于 C++Builder,需要确保 dbExpress 驱动程序的 DLL 文件和相应的头文件已经包含在项目的库路径中。

3.2 功能接口与示例代码

3.2.1 常用接口函数与方法

在 dbExpress 中,有一些关键的接口函数和方法,它们允许开发者连接到数据库、执行查询以及处理数据。以下是一些核心的 dbExpress 接口:

  • TSQLConnection :代表到特定数据库服务器的连接。
  • TSQLQuery :用于执行 SQL 命令和查询。
  • TSQLDataSet :提供一个通用的数据集,可以从 SQL 数据集中继承。
  • TSQLMonitor :用于监视数据库活动。
var
  SQLConnection: TSQLConnection;
  SQLQuery: TSQLQuery;
begin
  SQLConnection := TSQLConnection.Create(nil);
  SQLQuery := TSQLQuery.Create(nil);

  try
    SQLConnection.Params.Database := 'MyDatabase';
    SQLConnection.Params.UserName := 'dbuser';
    SQLConnection.Params.Password := 'dbpassword';
    SQLConnection.Params.LoginPrompt := False;
    SQLConnection.Params.DriverName := 'PQ驱动程序';
    SQLConnection.Open;

    SQLQuery.SQLConnection := SQLConnection;
    SQLQuery.SQL.Text := 'SELECT * FROM mytable';

    SQLQuery.Open;
    while not SQLQuery.Eof do
    begin
      // 处理数据行...
      SQLQuery.Next;
    end;
  finally
    SQLQuery.Free;
    SQLConnection.Free;
  end;
end;

上述代码块中展示了如何使用 TSQLConnection 和 TSQLQuery 组件来建立数据库连接并执行查询。在实际应用中,开发者需要根据具体的数据库名称、用户名、密码以及驱动程序名称来配置参数。

3.2.2 代码实例解析与调试技巧

在编写 dbExpress 代码时,熟悉以下调试技巧可以大大提高开发效率:

  1. 启用 SQL 日志记录 :通过设置 SQLConnection TraceMode TraceOptions 属性,可以记录所有的 SQL 语句和数据库活动。 delphi SQLConnection.TraceMode := True; SQLConnection.TraceOptions := [toDetail];

  2. 执行异常处理 :确保对可能引发异常的数据库操作进行异常处理。 delphi try // 数据库操作代码 except on E: Exception do ShowMessage('发生数据库错误: ' + E.Message); end;

  3. 使用断点和单步执行 :使用 Delphi 和 C++Builder 的调试器,设置断点并单步执行代码,观察变量状态和执行流程。

  4. 查看运行时错误日志 :IDE 的事件查看器会显示运行时的错误信息和警告,这对于诊断问题非常有用。

  5. 使用对象树和组件检查器 :利用 IDE 提供的对象树(Object TreeView)和组件检查器(Component Inspector)来查看和修改组件属性。

通过上述方法,开发者可以更准确地定位问题,加快开发进程,并优化最终的应用程序。

4. 驱动程序安装及配置方法

4.1 安装步骤详解

4.1.1 系统要求和安装前提

在安装PostgreSQL的dbExpress驱动程序之前,必须确认你的系统满足特定的安装要求。dbExpress驱动程序需要与Delphi或C++Builder环境兼容,具体版本依赖于驱动程序的版本。此外,必须先安装PostgreSQL数据库服务器。确保你的操作系统满足以下要求:

  • Windows 7 或更高版本
  • 支持的Delphi或C++Builder版本
  • 安装了PostgreSQL服务器,并且有相应的管理员权限访问数据库

确保你的系统已经通过互联网访问权限,因为安装程序可能需要下载额外的文件和更新。

4.1.2 驱动程序安装流程

安装dbExpress驱动程序是一个直观的过程,遵循以下步骤:

  1. 下载最新的驱动程序安装包,通常是一个.exe可执行文件。
  2. 以管理员权限运行安装程序。
  3. 按照安装向导的指示进行操作。通常,你需要接受许可协议,选择安装路径,并确定安装组件。
flowchart LR
A[开始安装] --> B[同意许可协议]
B --> C[选择安装路径]
C --> D[选择组件]
D --> E[完成安装]
  1. 安装向导结束后,重启你的IDE(例如Delphi或C++Builder),以便它能够识别新安装的驱动程序。

4.2 配置与优化

4.2.1 连接字符串的编写与调试

配置dbExpress驱动程序的一个关键步骤是正确编写连接字符串。连接字符串告诉应用程序如何连接到PostgreSQL服务器。以下是一个连接字符串的例子:

DriverName=PostgreSQL;Database=yourdb;User Id=youruser;Password=yourpassword;Server=yourserver;Port=5432;

在这里:

  • DriverName 指定了使用的驱动程序名称。
  • Database 是你要连接的数据库名。
  • User Id Password 是登录数据库所需的认证凭证。
  • Server Port 指定了数据库服务器的位置和端口。

在IDE中测试连接字符串时,确保替换其中的占位符为你自己的数据库服务器的实际信息。

4.2.2 性能优化与故障排除

一旦成功配置了连接,接下来可以优化dbExpress驱动程序的性能。性能优化通常涉及以下几个方面:

  • 使用索引来提升查询性能。
  • 配置适当的事务隔离级别以处理并发。
  • 限制数据库连接数以避免资源过度使用。

使用dbExpress驱动程序时可能遇到的常见问题包括连接失败和性能瓶颈。故障排除时,请确保:

  • 服务器地址和端口配置正确。
  • 所有网络连接都是畅通的。
  • 驱动程序与数据库服务器版本兼容。
  • 服务器上没有防火墙或安全设置阻止连接。
| 错误代码 | 错误描述 | 解决方案 |
|-----------|-----------|-----------|
| 08001     | 连接失败 | 确认服务器地址、端口、用户名和密码的正确性 |
| 08003     | 无法连接 | 检查网络连接和防火墙设置 |
| 08006     | 事务处理失败 | 检查事务隔离级别和数据库服务器状态 |

通过这些策略,你可以显著提高PostgreSQL数据库与Delphi或C++Builder应用程序之间的交互效率。

5. 源代码提供情况及其使用优势

5.1 源代码的获取方式

5.1.1 开源协议和许可说明

当我们在谈论开源时,我们通常是在谈论其许可协议。这些协议定义了允许个人或组织如何使用、修改和分发源代码。PostgreSQL dbExpress 驱动程序作为开源软件,它遵循某个或某些特定的开源协议,以确保代码的自由使用,同时保护贡献者的合法权益。比如,PostgreSQL 的一些组件可能会采用 BSD、GPL 或 LGPL 等协议。

开源协议通常包含以下几类重要条款:

  • 版权声明 :明确源代码归属和版权声明。
  • 复制权 :允许用户复制和分发代码。
  • 修改权 :允许用户修改代码。
  • 分发权 :允许用户分发修改后的代码。
  • 责任与保证 :明确代码无保证责任的条款。
  • 专利使用 :一些许可可能包括专利许可条款。

在使用 PostgreSQL dbExpress 驱动程序的源代码之前,请务必仔细阅读其授权协议,以确保您的使用方式符合协议要求,避免法律风险。

5.1.2 如何获取源代码

获取开源项目源代码的过程相对简单。通常,您可以通过以下途径之一访问源代码:

  • 项目官方网站 :许多开源项目都有一个官方主页,其中包含了代码仓库的链接。对于 PostgreSQL dbExpress 驱动程序,您可以访问其官方网站或相关社区的资源页面,找到源代码的下载链接。
  • 代码托管平台 :GitHub、GitLab、BitBucket 等平台是开源项目常用的托管服务。您可以在这些平台上找到 PostgreSQL dbExpress 的项目仓库,然后使用 Git 命令行工具或者平台提供的图形界面工具进行克隆(clone)或下载(download)。
  • 包管理器 :某些编程语言具有专门的包管理器,如 npm 用于 JavaScript、Maven 用于 Java 等。通过这些包管理器,您可以直接搜索并安装特定的软件包。

示例:在 GitHub 上克隆 PostgreSQL dbExpress 驱动程序代码库的 Git 命令:

git clone https://github.com/postgresql/postgresql-odbc-driver.git

请确保您的环境中已经安装了 Git,并且您有足够的权限访问和克隆该项目。

5.2 源代码的应用优势

5.2.1 自定义开发与功能扩展

源代码的可获取性为开发者提供了极大的灵活性,特别是涉及到需要自定义开发或扩展功能的情况。拥有源代码可以让您:

  • 深入理解实现机制 :深入底层代码可以更好地了解框架的工作原理,帮助您优化和调整现有功能以满足特定需求。
  • 定制化开发 :您可能需要一些特定功能或性能优化,直接修改源代码以实现这些定制化需求。
  • 修复已知问题 :当遇到 bug 或性能瓶颈时,您可以直接在代码层面进行修复。

例如,如果您希望在驱动程序中加入对新的数据库特性支持,您可以直接在源代码中添加相应代码,并确保其与现有的架构和设计模式兼容。

5.2.2 贡献代码与社区支持

开源项目的一大优势是社区的参与和贡献。当您使用 PostgreSQL dbExpress 的源代码,并对其做出改进后,您可以:

  • 提交改进 :您可以向原有项目贡献您的代码更改,这样其他人也可以从您的工作成果中受益。
  • 参与讨论 :开源社区通常是活跃的,您可以加入讨论组,与全球的开发者交流心得和问题。
  • 获得支持 :在遇到问题时,除了自行研究代码,您还可以寻求社区的帮助和支持。

您可以通过项目的贡献指南了解如何正确地为项目做出贡献。大部分开源项目都欢迎并鼓励开发者贡献代码,但同时也会有一套标准流程来维护项目的代码质量。

示例:向 PostgreSQL dbExpress 驱动程序项目提交贡献的步骤:

  1. 确保您遵循了项目的所有贡献指南。
  2. 通过 fork 项目仓库来创建一个自己的版本。
  3. 在您的版本中进行必要的更改。
  4. 提交 pull request(PR)到原始项目仓库,同时附上详细说明。
  5. 等待项目维护者对您的 PR 进行审查,并给出反馈。

通过这种方式,开源社区的力量得以聚集起来,共同推动项目的发展和进步。

6. dbExpress 框架在开发中的作用

6.1 dbExpress 框架概述

6.1.1 dbExpress 架构原理

dbExpress 是一个由 Borland 公司开发的轻量级数据库驱动框架,最初是作为 Delphi 和 C++Builder 的一部分。dbExpress 架构的设计理念在于提供一个简单、高效的方式来访问数据库。它支持多种数据库,包括但不限于 PostgreSQL、MySQL、Oracle 和 Microsoft SQL Server。

dbExpress 框架的核心是基于一组数据库无关的接口,这允许开发者使用统一的 API 来操作不同的数据库。其架构的一个关键优势是它不会在客户端存储任何数据库特定的组件,因此可以减少最终应用程序的大小和复杂性。

dbExpress 架构包括以下几个主要组件:

  • 数据库驱动程序 :与特定数据库交互的软件模块。
  • 数据库连接 :应用程序到数据库服务器的逻辑连接。
  • SQL 监视器 :用于追踪 SQL 命令执行过程的工具。
  • 数据集 :表示从数据库检索或发送给数据库的数据的组件。

通过这些组件,dbExpress 实现了与数据库的高效通信,同时保持了代码的可移植性和易于维护性。

6.1.2 与数据库交互的机制

dbExpress 与数据库交互的主要机制包括以下几个步骤:

  1. 初始化连接 :通过 dbExpress 的 TSQLConnection 组件创建与数据库的连接。
  2. 执行命令 :通过 TSQLQuery TSQLStoredProc 组件执行 SQL 命令。
  3. 处理数据 :从数据库检索的数据被封装在 TDataSet 组件中,供开发者使用。
  4. 关闭连接 :操作完成后关闭数据库连接。

dbExpress 框架使用数据集( TDataSet )作为其主要的数据抽象层,它允许以统一的方式处理数据,无论底层数据库是何种类型。这种设计降低了学习不同数据库特定操作的复杂性,并且提高了代码的可重用性。

开发者可以通过 dbExpress 直接编写 SQL 命令或使用 Delphi/C++Builder 提供的数据库感知组件来简化数据访问。此外,dbExpress 还允许开发者通过其驱动程序接口自定义和扩展其功能,以适应特定数据库的需求。

6.2 开发中的实际应用

6.2.1 数据访问组件的使用方法

在 Delphi 和 C++Builder 的开发环境中,dbExpress 提供了一组数据访问组件,它们被用来实现与数据库的交互。这些组件包括:

  • TSQLConnection :代表与数据库的物理连接。
  • TSQLQuery :执行 SQL 查询。
  • TSQLTransaction :管理事务。
  • TSQLDataSet :数据集组件,用于访问和修改数据。
  • TSQLStoredProc :执行存储过程。

使用这些组件,开发者可以轻松地完成数据库的连接、查询、更新等操作。例如,一个简单的查询操作可以如下进行:

var
  Query: TSQLQuery;
begin
  // 创建 TSQLQuery 实例
  Query := TSQLQuery.Create(nil);
  try
    // 设置数据库连接
    Query.SQLConnection := SQLConnection1;
    // 指定要执行的 SQL 语句
    Query.SQL.Text := 'SELECT * FROM customers';
    // 打开查询
    Query.Open;
    // 遍历返回的数据集
    while not Query.Eof do
    begin
      // 处理每行数据
      Memo1.Lines.Add(Query.FieldByName('customer_name').AsString);
      Query.Next;
    end;
  finally
    // 清理资源
    Query.Free;
  end;
end;

6.2.2 框架性能与优势分析

dbExpress 框架在 Delphi 和 C++Builder 开发中具有显著的优势:

  • 性能 :dbExpress 旨在提供快速且资源消耗较小的数据访问,特别是在只读操作和简单的数据交互中表现优异。
  • 跨平台性 :dbExpress 组件在不同的操作系统上都有一致的表现,使得 Delphi/C++Builder 开发的应用具有很好的跨平台能力。
  • 灵活性 :开发者可以编写自定义的驱动程序来支持新的数据库,或扩展现有驱动程序的功能。
  • 易于集成 :dbExpress 组件可以方便地集成到现有的应用程序中,无需对架构进行重大调整。

尽管 dbExpress 具有诸多优势,但在使用时也要注意它的一些限制,比如相对有限的事务支持、连接池管理等。在需要进行高级事务管理或执行大量并发写操作的场景中,可能需要考虑使用其他数据库访问技术。

在性能优化方面,dbExpress 框架提供了多种配置选项,如预编译的 SQL 语句、批处理操作和连接池,开发者可以根据应用需求调整这些参数来提升性能。此外,dbExpress 的源代码是开放的,因此开发者可以根据自己的需求进行定制和优化。

7. 使用前的环境和权限注意事项

7.1 环境配置要求

7.1.1 操作系统兼容性

PostgreSQL dbExpress 驱动程序要求运行在支持的 Windows 操作系统版本上。具体而言,它与 Windows 7、Windows 8 和 Windows 10 兼容,对于服务器环境,也支持 Windows Server 的对应版本。除了操作系统本身的要求外,还需确认系统上安装了适当的 .NET Framework 版本,通常是 4.5 或更新版本。此外,驱动程序可能还会依赖于其他系统组件,如 Visual C++ Redistributable,必须在安装 dbExpress 之前安装这些组件。

7.1.2 驱动程序依赖关系

在安装 PostgreSQL dbExpress 驱动程序之前,需要确定系统中已经安装了 PostgreSQL 数据库服务器,并且它正常运行。确保数据库的版本与驱动程序兼容。此外,驱动程序安装包可能包含其他库或框架,例如 Oracle 客户端库或其他第三方组件。安装之前,应该阅读官方文档以确认所有依赖关系都已经得到满足。在某些情况下,数据库管理员可能会提供特定版本的驱动程序,需要确保这种版本的驱动程序与所使用的开发环境兼容。

7.2 权限和安全性考虑

7.2.1 用户权限管理

为了确保应用程序的安全性,必须仔细管理数据库的用户权限。在使用 dbExpress 驱动程序连接到 PostgreSQL 数据库时,应该创建专用的应用程序用户,并只为该用户授予其在数据库中执行必要操作所需的最小权限集。例如,如果应用程序只需要读取特定表中的数据,则应避免授予写入或删除权限。在连接字符串中指定用户凭证时,也应确保这些凭证不会暴露在不安全的存储位置。

7.2.2 数据安全与备份策略

在使用 dbExpress 驱动程序进行数据库操作时,需要定期备份数据库以防止数据丢失。可以采用定时任务来自动化备份过程,确保数据的一致性和完整性。同时,需要在应用层采取措施,比如在进行关键数据操作时实现事务处理,以保证操作的原子性,确保数据不会因异常或错误操作而损坏。

请按照以下步骤,检查并设置环境与权限:

  1. 确认操作系统兼容性 :检查你的操作系统版本是否在支持列表中。
  2. 安装依赖组件 :确认并安装所有需要的依赖项,如 .NET Framework 和任何特定的 Redistributable 组件。
  3. 数据库服务器运行状态 :确保 PostgreSQL 数据库服务器运行正常,可以接受连接。
  4. 设置数据库用户权限 :根据最小权限原则,为应用程序创建专用用户,并配置适当的角色和权限。
  5. 实施数据备份策略 :制定和实施一个定期备份计划,确保数据的安全性。

这些步骤将帮助你建立一个稳定和安全的环境,以便有效地使用 dbExpress 驱动程序进行 PostgreSQL 数据库操作。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:DevArt 提供了 dbExpress 驱动程序,用于连接 PostgreSQL 数据库,简化了开发者的数据库操作。该驱动集成了 dbExpress 框架,支持多种数据库操作功能,如连接、查询和事务处理。包含了源代码,为开发者提供了灵活性和定制能力。使用前需确保安装了 dbExpress 框架,并正确配置数据库访问权限。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐