
# GaussDB应用程序开发教程概述
GaussDB支持通过JDBC、ODBC、libpq、Psycopg、Go、ecpg等接口来连接数据库并进行操作。
#### JDBC
JDBC（Java Database Connectivity，Java数据库连接）是用于执行SQL语句的Java API，可以为多种关系数据库提供统一访问接口。它允许Java应用程序通过SQL语句来执行数据库操作，包括查询、插入、更新和删除数据等。
以下是JDBC的一些关键特点和用法：
1. 数据库连接管理：JDBC允许应用程序建立与数据库的连接，并管理这些连接的生命周期。
2. SQL执行： 使用JDBC，可以执行SQL查询、更新、删除等操作。这通过在Java代码中构建SQL语句并将其发送到数据库来实现。
3. 事务管理：JDBC支持事务管理，可以通过JDBC API来启动、提交或回滚事务，确保数据库操作的一致性和完整性。
4. 异常处理： JDBC定义了一组异常类来处理数据库操作期间可能发生的各种异常情况，开发人员可以使用try-catch块来捕获和处理这些异常。
5. 批处理操作：JDBC提供了批处理功能，允许一次性执行多个SQL语句，从而提高数据库操作的效率。
6. 元数据访问： 通过JDBC，可以获取数据库的元数据信息，如表结构、列名、数据类型等，从而动态地构建SQL查询或根据数据库结构进行操作。
总的来说，JDBC提供了一个灵活且强大的桥梁，使Java应用程序能够与各种不同的数据库进行交互，从而实现数据的持久化和管理。GaussDB库提供了对JDBC 4.2特性的支持，需要使用JDK1.8版本编译程序代码，不支持JDBC桥接ODBC方式。
基于JDBC开发详细教程请参见[基于JDBC开发](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0065.html#ZH-CN_TOPIC_0000002527827994)。
#### ODBC
ODBC（Open Database Connectivity，开放数据库互连）是由Microsoft公司基于X/OPEN CLI提出的以C/C++语言来访问数据库的应用程序编程接口。它提供了一种统一的方法，让应用程序可以访问各种数据库管理系统（DBMS），而不用考虑具体的数据库类型或者操作系统平台。ODBC允许应用程序使用SQL来查询、插入、更新和删除数据库中的数据。应用程序通过ODBC提供的API与数据库进行交互，增强了应用程序的可移植性、扩展性和可维护性。
ODBC的架构包括三个主要组件：应用程序、ODBC驱动管理程序和ODBC驱动程序。应用程序使用ODBC API与ODBC驱动管理程序通信，而ODBC驱动管理程序负责加载和管理ODBC驱动程序。ODBC驱动程序则负责与特定的数据库通信，执行SQL查询并返回结果。ODBC的系统架构请参见[图1]。
总而言之，ODBC提供了一种灵活且跨平台的方法，使得用户可以轻松地将应用程序连接到各种数据库，而无需担心特定数据库系统的细节。
基于ODBC开发详细教程请参见[基于ODBC开发](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0106.html#ZH-CN_TOPIC_0000002558947829)。
图1ODBC系统架构   
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/figure/zh-cn_image_0000002526899874.png)
GaussDB目前在以下环境中提供对ODBC的支持。
表1ODBC支持平台 
| 操作系统                     | 平台      |
|:---|:---|
| EulerOS V2.0SP5          | x86_64位 |
| EulerOS V2.0SP9          | ARM64位  |
| EulerOS V2.0SP10         | x86_64位 |
| EulerOS V2.0SP10         | ARM64位  |
| Windows 7                | x86_32位 |
| Windows 7                | x86_64位 |
| Windows Server 2008      | x86_32位 |
| Windows Server 2008      | x86_64位 |
| Kylin V10                | x86_64位 |
| Kylin V10                | ARM64位  |
| UnionTech V20            | x86_64位 |
| UnionTech V20            | ARM64位  |
| Huawei Cloud EulerOS 2.0 | x86_64位 |
| Huawei Cloud EulerOS 2.0 | ARM64位  |
| Suse12.5                 | x86_64位 |
   
Unix/Linux系统下的驱动程序管理器主要有unixODBC和iODBC，在这选择驱动管理器unixODBC-2.3.7作为连接数据库的组件。
Windows系统自带ODBC驱动程序管理器，在控制面板-\>管理工具中可以找到数据源（ODBC）选项。
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
当前数据库ODBC驱动基于开源版本，对于tinyint、smalldatetime、nvarchar、nvarchar2类型，在获取数据类型的时候，可能会出现不兼容的情况。
在Suse12.5上，默认没有libltdl库，需要安装libltdl库后，才可以使用ODBC。
ODBC相关约束说明：
- ODBC不支持自定义类型，不支持在存储过程中使用自定义类型参数。
- 当数据库开启proc_outparam_override参数时，ODBC无法正常调用带有out参数的存储过程。
- 不支持容灾场景的备机读。
- ODBC字符类型暂时不支持零字符。
 
#### libpq
libpq是GaussDB C应用程序接口。libpq是一套允许客户程序向GaussDB服务器进程发送查询并且获得查询返回值的库函数。同时也是其他几个GaussDB应用接口下面的引擎，如ODBC等依赖的库文件。
基于libpq开发详细教程请参见[基于libpq开发](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0136.html#ZH-CN_TOPIC_0000002558947849)。
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
libpq字符类型暂时不支持零字符。
#### Psycopg
Psycopg是一种用于执行SQL语句的PythonAPI，可以为GaussDB数据库提供统一访问接口，应用程序可基于它进行数据操作。Psycopg2是对libpq的封装，主要使用C语言实现，既高效又安全。它具有客户端游标和服务器端游标、异步通信和通知、支持"COPY TO/COPY FROM"功能。支持多种类型Python开箱即用，适配GaussDB数据类型。通过灵活的对象适配系统，可以扩展和定制适配。Psycopg2兼容Unicode。
GaussDB数据库提供了对Psycopg2特性的支持，并且支持psycopg2通过SSL模式连接。
基于Psycopg开发详细教程请参见[基于Psycopg开发](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0175.html#ZH-CN_TOPIC_0000002527828066)。
表2Psycopg支持平台 
| 操作系统                                   | 平台                                                                                                                                                                                                                                                                                                                                                                                                                        | Python版本 |
|:---|:---|:---|
| EulerOS V2.0SP5、Suse 12.5              | - ARM64位  - x86_64位       | 3.8.5    |
| EulerOS V2.0SP9                        | - ARM64位                                                                                                                                                                        | 3.7.4    |
| EulerOS V2.0SP10、Kylin v10、UnionTech20 | - ARM64位  - x86_64位   | 3.7.9    |
| EulerOS V2.0SP11                       | - ARM64位  - x86_64位   | 3.9.11   |
| Huawei Cloud EulerOS 2.0               | - ARM64位  - x86_64位   | 3.9.9    |
   
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
psycopg2在编译过程中，会链接（link）GaussDB的openssl，GaussDB的openssl与操作系统自带的openssl可能不兼容。如果遇到不兼容现象，例如提示"version 'OPENSSL_1_1_1f' not found"，请使用环境变量LD_LIBRARY_PATH进行隔离，以避免混用操作系统自带的openssl与GaussDB依赖的openssl。
例如，在执行某个调用psycopg2的应用软件client.py时，将环境变量显性赋予该应用软件：
```
export LD_LIBRARY_PATH=/path/to/gaussdb/libs:$LD_LIBRARY_PATH python client.py
```
其中，/path/to/psycopg2/lib 表示GaussDB依赖的openssl库所在目录，需根据文件实际存储路径修改。
#### Go
Go驱动是一个用于连接和操作GaussDB数据库的Go语言驱动。它提供了一些用于连接和操作GaussDB数据库的接口，可以用于执行查询、插入、更新和删除等操作。
以下是Go驱动当前支持的部分功能及其用法：
1. 数据库连接：Go驱动支持通过db.Open连接数据库。连接串支持URL和DSN两种格式。
2. SQL执行与查询：Go驱动提供接口如db.Exec、db.Query等，可以用于SQL的执行与查询 。
3. 事务管理：Go驱动支持Tx接口进行事务管理，其中实现了启动、提交、回滚事务等方法，确保数据库操作的一致性和完整性。
4. 元数据访问： Go驱动提供ColumnType接口用于查询数据库中列属性信息，包括是否可以为空、数据库类型名称、长度和小数位数等信息。
5. 可重用性：Go驱动提供Prepare方法用于预编译SQL，该SQL可以被多次执行，只需改变传入参数，提高数据库可重用性。
基于Go驱动开发详细教程请参见[基于Go驱动开发](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0196.html#ZH-CN_TOPIC_0000002527828074)。
#### ecpg
ecpg（embedded SQL C preprocessor for GaussDB Kernel）是一种用于C语言程序的嵌入式SQL预处理器。一个嵌入式SQL程序由一种普通编程语言编写的代码（此处为C语言）和SQL命令共同组成。要构建该程序，源代码（\*.pgc）首先通过嵌入式SQL预处理器，将源代码转换成一个普通C语言程序（\*.c），然后再通过编译器处理。转换过的ecpg应用通过嵌入式SQL库（ecpglib）调用libpq库中的函数，与GaussDB Kernel服务器使用普通的前端/后端协议通信。
嵌入式SQL程序是插入了数据库相关动作的特殊代码的C语言程序。这种特殊代码形式通常如下：
```
EXEC SQL ...;
```
这些语句在语法上取代了一个C语句，可以出现在全局或者是一个函数中。嵌入式SQL语句遵循普通SQL代码的大小写敏感规则，也允许嵌套的C语言代码风格注释（SQL标准的一部分）。不过，程序的C语言部分遵循C语言程序的标准，不支持嵌套注释。
基于ecpg开发详细教程请参见[基于ecpg开发](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0210.html#ZH-CN_TOPIC_0000002527988026)。
