华为云用户手册

  • 日志诊断场景 ODBC日志分为unixODBC驱动管理器日志和psqlODBC驱动端日志。前者可以用于追溯应用程序API的执行是否成功,后者是底层实现过程中的一些DFX日志,用来帮助定位问题。 unixODBC日志需要在odbcinst.ini文件中配置: 1 2 3 4 5 6 7 [ODBC] Trace=Yes TraceFile=/path/to/odbctrace.log [GaussMPP] Driver64=/usr/local/lib/psqlodbcw.so setup=/usr/local/lib/psqlodbcw.so psqlODBC日志只需要在odbc.ini加上: [gaussdb] Driver=GaussMPP Servername=10.10.0.13(数据库Server IP) ... Debug=1(打开驱动端debug日志) unixODBC日志将会生成在TraceFile配置的路径下,psqlODBC会在系统/tmp/下生成mylog_xxx.log。
  • 处理方法 方法1:启动客户端环境中的haveged服务,增加系统熵池熵值以提高读取随机数的速度。启动命令为: systemctl start haveged 方法2:调整客户端jdk配置 打开$JAVA_PATH/jre/lib/security/java.security文件,修改以下两个配置项: securerandom.source=file:/dev/./urandom securerandom.strongAlgorithms=NativePRNGNonBlocking:SUN 方法2的本质是在获取强随机数时,使用伪随机数代替,减少需要消耗的熵值。会影响客户端所有使用该jdk的应用,在获取强随机数时会使用伪随机数代替。
  • 数据类型映射关系 数据类型、JAVA变量类型以及JDBC类型索引关系如下(A:Oracle兼容,B:MY兼容)。 表1 JDBC数据类型映射关系 兼容模式 Gauss Kernel数据类型 JAVA变量类型 JDBC类型索引 A/B oid java.lang.Long java.sql.Types.BIGINT A/B numeric java.math.BigDecimal java.sql.Types.NUMERIC A/B tinyint java.lang.Integer java.sql.Types.TINYINT A/B smallint java.lang.Integer java.sql.Types.SMALLINT A/B bigint java.lang.Long java.sql.Types.BIGINT A/B float4 java.lang.Float java.sql.Types.REAL A/B float8 java.lang.Double java.sql.Types.DOUBLE A/B char java.lang.String java.sql.Types.CHAR A/B character java.lang.String java.sql.Types.CHAR A/B bpchar java.lang.String java.sql.Types.CHAR A/B character varying java.lang.String java.sql.Types.VARCHAR A/B varchar java.lang.String java.sql.Types.VARCHAR A/B text java.lang.String java.sql.Types.VARCHAR A/B name java.lang.String java.sql.Types.VARCHAR A/B bytea byte[] java.sql.Types.BINARY A/B blob java.sql.Blob java.sql.Types.BLOB A/B clob java.sql.Clob java.sql.Types.CLOB A/B bool java.lang.Boolean java.sql.Types.BIT B date java.sql.Date java.sql.Types.DATE A/B time java.sql.Time java.sql.Types.TIME A/B timetz java.sql.Time java.sql.Types.TIME A/B timestamp java.sql.Timestamp java.sql.Types.TIMESTAMP A/B smalldatetime java.sql.Timestamp java.sql.Types.TIMESTAMP A/B timestamptz java.sql.Timestamp java.sql.Types.TIMESTAMP A/B refcursor java.sql.ResultSet java.sql.Types.REF_CURSOR java.sql.Types.OTHER 父主题: JDBC
  • type ColumnType type ColumnType如下表所示。 方法 描述 返回值 (ci *ColumnType)DatabaseTypeName() 返回列类型的数据库系统名称。返回空字符串表示该驱动类型名字并未被支持。 error (ci *ColumnType)DecimalSize() 返回小数类型的范围和精度。 返回值ok的值为false时,说明给定的类型不可用或者不支持。 precision, scale int64, ok bool (ci *ColumnType)Length() 返回数据列类型长度。返回值ok的值为false时,说明给定的类型不存在长度。 length int64, ok bool (ci *ColumnType)ScanType() 返回一种Go类型,该类型能够在Rows.scan进行扫描时使用。 reflect.Type (ci *ColumnType)Name() 返回数据列的名字。 string 父主题: Go接口参考
  • 参数说明 参数 参数说明 ctx 表示给定的上下文。 query 被执行的sql语句。 args 被执行sql语句需要绑定的参数。支持按位置绑定和按名称绑定,详情见如下示例。 opts 事务隔离级别和事务访问模式,其中事务隔离级别(opts.Isolation)支持范围为sql.LevelReadUncommitted,sql.LevelReadCommitted,sql.LevelRepeatableRead,sql.LevelSerializable。事务访问模式(opts.ReadOnly)支持范围为true(read only)和false(read write)。
  • 参数 表1 数据库连接参数 参数名称 参数说明 host 主机IP地址,也可通过环境变量${PGHOST}来指定。 port 主机服务器的端口号,也可通过环境变量${PGPORT}来指定。 dbname 数据库名,也可通过环境变量${PGDATABASE}来指定。 user 要连接的用户名,也可通过环境变量${PGUSER}来指定。 password 要连接用户对应的连接密码。 connect_timeout 用于连接服务器操作的超时值,也可通过环境变量${PGCONNECT_TIMEOUT}来指定。 sslmode 启用SSL加密的方式,也可通过环境变量${PGSSLMODE}来指定。 参数取值范围: disable:不使用ssl安全连接。 allow:如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。 prefer:如果数据库支持,那么首选使用SSL安全加密连接,但不验证数据库服务器的真实性。 require:必须使用SSL安全连接,但是只做了 数据加密 ,而并不验证数据库服务器的真实性。 verify-ca:必须使用SSL安全连接,并验证服务器是否具有由可信任的证书机构签发的证书。 verify-full:必须使用SSL安全连接,并且验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致 sslkey 指定用于客户端证书的密钥位置,如果需要走SSL连接,并且该参数未指定,可通过设置环境变量${PGSSLKEY}来指定。 sslcert 指定客户端SSL证书的文件名,或者通过设置环境变量${PGSSLCERT}来指定。 sslrootcert 指定一个包含SSL证书机构(CA)证书的文件名称,或者通过设置环境变量${PGSSLROOTCERT}来指定。 sslcrl 指定ssl证书撤销列表(CRL)的文件名。列在这个文件中的证书如果存在,在尝试认证该服务器证书时会被拒绝,从而连接失败。也可通过环境变量${PGSSLCRL}来指定。 sslpassword 指定对密钥解密成明文的密码短语,当指定该参数的时候表示sslkey是一个加密存储的文件,当前sslkey支持des/aes加密方式。 说明: DES加密算法安全性低,存在安全风险,建议使用更安全的加密算法。 disable_prepared_binary_result 字符串类型,若设置为yes,表示此连接在从预准备语句接收查询结果时不应使用二进制格式。该参数仅用于调试。 取值范围:yes/no。 binary_parameters 字符串类型,该参数表示是否始终以二进制形式发送[]byte。取值范围:yes/no。若该参数设置为yes,建议绑定参数按照[]byte绑定,可以减少内部类型转换。 target_session_attrs 指定数据库的连接类型,该参数用于识别主备节点,也可通过环境变量${PGTARGETSESSIONATTRS}来指定。默认值为“any”,共有六种:any、master、slave、preferSlave、read-write、read-only。 any:尝试连接URL连接串中的任何一个数据节点。 master:尝试连接到URL连接串中的主节点,如果找不到就抛出异常。 slave:尝试连接到URL连接串中的备节点,如果找不到就抛出异常。 preferSlave:尝试连接到URL连接串中的备数据节点(如果有可用的话),否则连接到主数据节点。 read-write:读写模式,表示只能连接主节点。 read-only:只读模式,表示只能连接备节点。 loggerLevel 日志级别,打印相关调试信息,也可通过环境变量${PG LOG GERLEVEL}来指定。 支持trace/debug/info/warn/error/none,级别从高到低。 application_name 设置正在使用连接的GO驱动的名称。缺省值为go-driver,该参数不建议用户配置。 RuntimeParams 设置连接会话时默认运行的set类型的guc参数的值。例如参数名search_path,application_name,timezone等。各参数的详细介绍参见客户端连接缺省设置,可通过show语法查看参数是否设置成功。
  • 参数 表1 psycopg2.connect参数 关键字 参数说明 dbname 数据库名称。 user 用户名。 password 密码。 host 数据库IP地址,默认为UNIX socket类型。 port 连接端口号,默认为5432。 sslmode ssl模式,ssl连接时用。 sslcert 客户端证书路径,ssl连接时用。 sslkey 客户端密钥路径,ssl连接时用。 sslrootcert 根证书路径,ssl连接时用。 hostaddr 数据库IP地址。 connect_timeout 客户端连接超时时间。 client_encoding 客户端编码格式。 application_name application_name的参数值。 fallback_application_name application_name参数的回退值。 keepalives 控制是否客户端tcp保持连接,默认为1,表示打开;值为0时,表示关闭。若UNIX域套接字连接,则忽略。 options 连接开始时发送给服务器的命令行选项。 keepalives_idle 控制向服务器发送keepalive消息之前不活动的描述,若keepalive被禁用,则忽略此参数。 keepalives_interval 控制未得到服务器确认的keepalive消息应重新传输的描述,若keepalive被禁用,则忽略此参数。 keepalives_count 控制客户端与服务端连接断开之前可能丢失的tcp保持连接的数量。 replication 确认连接使用的是复制协议而不是普通协议。 requiressl 支持sslmode设置。 sslcompression ssl压缩。设置为1,则通过ssl连接发送的数据将被压缩;设置为0,则禁用压缩。若没有建立ssl的连接,则忽略此参数。 sslcrl 证书吊销列表文件路径,验证ssl服务端证书是否可用。 requirepeer 指定服务器的操作系统用户名。
  • Psycopg接口参考 Psycopg接口是一套提供给用户的API方法,本节将对部分常用接口做具体描述。 psycopg2.connect() connection.cursor() cursor.execute(query,vars_list) cursor.executemany(query,vars_list) connection.commit() connection.rollback() cursor.fetchone() cursor.fetchall() cursor.close() connection.close() 父主题: 基于Psycopg开发
  • 示例:常用操作 import psycopg2 import os # 从环境变量中获取用户名和密码 user = os.getenv('user') password = os.getenv('password') # 创建连接对象 conn=psycopg2.connect(database="database", user=user, password=password, host="localhost", port=port) cur=conn.cursor() #创建指针对象 # 创建连接对象(SSl连接) conn = psycopg2.connect(dbname="database", user=user, password=password, host="localhost", port=port, sslmode="verify-ca", sslcert="client.crt",sslkey="client.key",sslrootcert="cacert.pem") 注意: 如果sslcert、sslkey、sslrootcert没有填写,默认取当前用户.postgresql目录下对应的client.crt、client.key、root.crt # 创建表 cur.execute("CREATE TABLE student(id integer,name varchar,sex varchar);") # 插入数据 cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(1,'Aspirin','M')) cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(2,'Taxol','F')) cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(3,'Dixheral','M')) # 批量插入数据 stus = ((4,'John','M'),(5,'Alice','F'),(6,'Peter','M')) cur.executemany("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",stus) # 获取结果 cur.execute('SELECT * FROM student') results=cur.fetchall() print (results) # 提交操作 conn.commit() # 插入一条数据 cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(7,'Lucy','F')) # 回退操作 conn.rollback() # 关闭连接 cur.close() conn.close() psycopg2常用连接方式 1. conn = psycopg2.connect(dbname="dbname", user=user, password=password, host="localhost", port=port) 2. conn = psycopg2.connect(f"dbname=dbname user={user} password={password} host=localhost port=port") 3. 使用日志 import logging import psycopg2 from psycopg2.extras import LoggingConnection import os # 从环境变量中获取用户名和密码 user = os.getenv('user') password = os.getenv('password') logging.basicConfig(level=logging.DEBUG) # 日志级别 logger = logging.getLogger(__name__) db_settings = { "user": user, "password": password, "host": "localhost", "database": "dbname", "port": port } # LoggingConnection默认记录所有SQL,可自行实现filter过滤不需要的或敏感的SQL,下面给出了简单的过滤password相关SQL的示例 class SelfLoggingConnection(LoggingConnection): def filter(self, msg, curs): if db_settings['password'] in msg.decode(): return b'queries containing the password will not be recorded' return msg conn = psycopg2.connect(connection_factory=SelfLoggingConnection, **db_settings) conn.initialize(logger) LoggingConnection默认记录所有SQL信息,且不会对敏感信息进行脱敏,可通过filter函数自行定义输出的SQL内容。 日志功能是psycopg2为了方便开发者显性调试全量SQL而提供额外功能,默认情况下不需要使用。该功能会在pyscopg2执行SQL语句前打印SQL语句,但是,需要在debug日志级别下才会输出。该功能不是默认功能,只是在有特殊需要的时候才使用,没有特别需求,不建议使用。详情参考:https://www.psycopg.org/docs/extras.html?highlight=loggingconnection 父主题: 基于Psycopg开发
  • Psycopg包 准备相关驱动和依赖库。可以从发布包中获取,包名为 GaussDB -Kernel_数据库版本号_操作系统版本号_64bit_Python.tar.gz。 解压后有两个文件夹: psycopg2:psycopg2库文件。 lib:lib库文件。 加载驱动。 在使用驱动之前,需要做如下操作: 先解压版本对应驱动包。 tar zxvf xxxx-Python.tar.gz 使用root用户将psycopg2复制到python安装目录下的site-packages文件夹下。 su root cp psycopg2 $(python3 -c 'import site; print(site.getsitepackages()[0])') -r 修改psycopg2目录权限为755。 chmod 755 $(python3 -c 'import site; print(site.getsitepackages()[0])')/psycopg2 -R 将psycopg2目录添加到环境变量$PYTHONPATH,并使之生效。 export PYTHONPATH=$(python3 -c 'import site; print(site.getsitepackages()[0])'):$PYTHONPATH 对于非数据库用户,需要将解压后的lib目录,配置在LD_LIBRARY_PATH中。 export LD_LIBRARY_PATH=path/to/lib:$LD_LIBRARY_PATH 在创建数据库连接之前,需要先加载如下数据库驱动程序: 1 import psycopg2 连接数据库。 非SSL方式连接数据库: 使用psycopg2.connect函数获得connection对象。 使用connection对象创建cursor对象。 SSL方式连接数据库: 用户通过psycopy2连接GaussDB服务器时,可以通过开启SSL加密客户端和服务器之间的通讯。在使用SSL时,默认用户已经获取了服务端和客户端所需要的证书和私钥文件,关于证书等文件的获取请参见Openssl相关文档和命令。 使用*.ini文件(python的configparser包可以解析这种类型的配置文件)保存数据库连接的配置信息。 在连接选项中添加SSL连接相关参数:sslmode、sslcert、sslkey、sslrootcert。 sslmode:可选项见表1。 sslcert:客户端证书路径。 sslkey:客户端密钥路径。 sslrootcert:根证书路径。 使用psycopg2.connect函数获得connection对象。 使用connection对象创建cursor对象。 使用SSL安全连接数据库,需保证所使用的python解释器为生成动态链接库(.so)文件的方式编译,可通过如下步骤确认python解释器的连接方式。 在python解释器命令行中输入import ssl,导入SSL。 执行ps ux查询python解释器运行的pid(假设pid为******)。 在shell命令行中执行pmap -p ****** | grep ssl,查看返回结果中是否包含libssl.so的相关路径。如果有,则python解释器为动态链接方式编译。 表1 sslmode的可选项及其描述 sslmode 是否会启用SSL加密 描述 disable 否 不使用SSL安全连接。 allow 可能 如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。 prefer 可能 如果数据库支持,那么首选使用SSL连接,但不验证数据库服务器的真实性。 require 是 必须使用SSL安全连接,但是仅进行数据加密,而并不验证数据库服务器的真实性。 verify-ca 是 必须使用SSL安全连接,并且校验服务端CA有效性。 verify-full 是 必须使用SSL安全连接,目前GaussDB暂不支持。 执行SQL语句。 构造操作语句,使用%s作为占位符,执行时psycopg2会用参数值智能替换掉占位符。可以添加RETURNING子句,来得到自动生成的字段值。 使用cursor.execute方法来操作一行SQL语句,使用cursor.executemany方法来操作多行SQL语句。 处理结果集。 cursor.fetchone():这种方法提取的查询结果集的下一行,返回一个序列,没有数据可用时则返回空。 cursor.fetchall():这种方法获取所有查询结果(剩余)行,返回一个列表。空行时则返回空列表。 对于数据库特有数据类型,如tinyint类型,查询结果中相应字段为字符串形式。 关闭连接。 在使用数据库连接完成相应的数据操作后,需要关闭数据库连接。关闭数据库连接可以直接调用其close方法,如connection.close()。 此方法关闭数据库连接,并不自动调用commit()。如果只是关闭数据库连接而不调用commit()方法,那么所有更改将会丢失。 父主题: 基于Psycopg开发
  • 基于Psycopg开发 Psycopg是一种用于执行SQL语句的PythonAPI,可以为 GaussDB数据库 提供统一访问接口,应用程序可基于它进行数据操作。Psycopg2是对libpq的封装,主要使用C语言实现,既高效又安全。它具有客户端游标和服务器端游标、异步通信和通知、支持“COPY TO/COPY FROM”功能。支持多种类型Python开箱即用,适配GaussDB数据类型;通过灵活的对象适配系统,可以扩展和定制适配。Psycopg2兼容Unicode。 GaussDB数据库提供了对Psycopg2特性的支持,并且支持psycopg2通过SSL模式连接。 表1 Psycopg支持平台 操作系统 平台 Python版本 EulerOS 2.5 ARM64位 x86_64位 3.8.5 EulerOS 2.9 ARM64位 x86_64位 3.7.4 EulerOS 2.10, Kylin v10, UnionTech20 ARM64位 x86_64位 3.7.9 EulerOS 2.11, Suse 12.5 ARM64位 x86_64位 3.9.11 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/pyscopg2/lib表示GaussDB依赖的openssl库所在目录,需根据文件实际存储路径修改。 开发流程 Psycopg包 示例:常用操作 Psycopg接口参考 父主题: 应用程序开发教程
  • 返回值 PQresultStatus:命令执行结果的枚举,包括: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 PQresultStatus可以返回下面数值之一: PGRES_EMPTY_QUERY 发送给服务器的字串是空的。 PGRES_COMMAND_OK 成功完成一个不返回数据的命令。 PGRES_TUPLES_OK 成功执行一个返回数据的查询(比如SELECT或者SHOW)。 PGRES_COPY_OUT (从服务器)Copy Out (拷贝出)数据传输开始。 PGRES_COPY_IN Copy In(拷贝入)(到服务器)数据传输开始。 PGRES_BAD_RESPONSE 服务器的响应无法理解。 PGRES_NONFATAL_ERROR 发生了一个非致命错误(通知或者警告)。 PGRES_FATAL_ERROR 发生了一个致命错误。 PGRES_COPY_BOTH 拷贝入/出(到和从服务器)数据传输开始。这个特性当前只用于流复制, 所以这个状态不会在普通应用中发生。 PGRES_SINGLE_TUPLE PGresult包含一个来自当前命令的结果元组。 这个状态只在查询选择了单行模式时发生
  • 注意事项 在非阻塞连接上发送任何命令或数据之后,调用PQflush。如果返回1,则等待套接字变为读或写就绪。如果为写就绪状态,则再次调用PQflush。如果已经读到,调用PQconsumeInput,然后再次调用PQflush。重复,直到PQflush返回0。(必要检查读就绪并使用 PQconsumeInput 耗尽输入,因为服务器可能会阻止尝试向客户端发送数据(例如 NOTICE 消息),并且在客户端读取它的数据之前不会读取客户端的数据。)一旦PQflush返回0,就等待套接字准备好,然后按照上面描述读取响应。
  • 原型 int PQsendQueryPrepared(PGconn *conn, const char *stmtName, int nParams, const char * const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat);
  • 原型 int PQsendQueryParams(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char * const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat);
  • 异步命令处理函数 PQexec函数对普通的同步应用里提交命令已经足够使用。但是它却有几个缺陷,而这些缺陷可能对某些用户很重要: PQexec等待命令结束,而应用可能还有其它的工作要做(比如维护用户界面等),此时并不希望PQexec阻塞应用。 因为客户端应用在等待结果的时候是处于挂起状态的,所以应用很难判断它是否该尝试结束正在进行的命令。 PQexec只能返回一个PGresult结构。如果提交的命令字符串包含多个SQL命令,除了最后一个PGresult以外都会被PQexec丢弃。 PQexec总是收集命令的整个结果,将其缓存在一个PGresult中。虽然这为应用简化了错误处理逻辑,但是对于包含多行的结果是不切实际的。 不想受到这些限制的应用可以改用下面的函数,这些函数也是构造PQexec的函数:PQsendQuery和PQgetResult。PQsendQueryParams,PQsendPrepare,PQsendQueryPrepared也可以和PQgetResult一起使用。 PQsendQuery PQsendQueryParams PQsendPrepare PQsendQueryPrepared PQflush 父主题: libpq接口参考
  • 注意事项 PQprepare创建一个为PQexecPrepared执行用的预备语句,本特性支持命令的重复执行,不需要每次都进行解析和规划。PQprepare仅在协议3.0及以后的连接中支持,使用协议2.0时,PQprepare将失败。 该函数从查询字符串创建一个名为stmtName的预备语句,该查询字符串必须包含一个SQL命令。stmtName可以是""来创建一个未命名的语句,在这种情况下,任何预先存在的未命名的语句都将被自动替换;否则,如果在当前会话中已经定义了语句名称,那么这就是一个错误。如果使用了任何参数,那么在查询中将它们称为$1,$2等。nParams是在paramTypes[]数组中预先指定类型的参数的数量。(当nParams为0时,数组指针可以为NULL) paramTypes[]通过OID指定要分配给参数符号的数据类型。如果paramTypes为NULL ,或者数组中的任何特定元素为零,服务器将按照对非类型化字面字符串的相同方式为参数符号分配数据类型。另外,查询可以使用数字高于nParams的参数符号;还将推断这些符号的数据类型。 通过执行SQLPREPARE语句,还可以创建与PQexecPrepared一起使用的预备语句。此外,虽然没有用于删除预备语句的libpq函数,但是SQL DEALLOCATE语句可用于此目的。
  • 原型 PGresult* PQexecPreparedBatch(PGconn* conn, const char* stmtName, int nParams, int nBatchCount, const char* const* paramValues, const int* paramLengths, const int* paramFormats, int resultFormat);
  • 参数 表1 PQexecPreparedBatch参数 关键字 参数说明 conn 连接句柄。 stmtName stmt名称,可以用""或者NULL来引用未命名语句,否则它必须是一个现有预备语句的名字。 nParams 参数个数。 nBatchCount 批量数。 paramValues 参数的实际值。 paramLengths 参数的实际数据长度。 paramFormats 参数的格式(文本或二进制)。 resultFormat 结果的格式(文本或二进制)。
  • 原型 PGresult* PQexecPrepared(PGconn* conn, const char* stmtName, int nParams, const char* const* paramValues, const int* paramLengths, const int* paramFormats, int resultFormat);
  • 参数 表1 PQexecPrepared参数 关键字 参数说明 conn 连接句柄。 stmtName stmt名称,可以用""或者NULL来引用未命名语句,否则它必须是一个现有预备语句的名字。 nParams 参数个数。 paramValues 参数的实际值。 paramLengths 参数的实际数据长度。 paramFormats 参数的格式(文本或二进制)。 resultFormat 结果的格式(文本或二进制)。
  • 原型 PGresult* PQexecParamsBatch(PGconn* conn, const char* command, int nParams, int nBatch, const Oid* paramTypes, const char* const* paramValues, const int* paramLengths, const int* paramFormats, int resultFormat);
  • 参数 表1 PQexecParamsBatch参数 关键字 参数说明 conn 连接句柄。 command SQL文本串。 nParams 绑定参数的个数 nBatch 批量操作数。 paramTypes 绑定参数类型。 paramValues 绑定参数的值。 paramLengths 参数长度。 paramFormats 参数格式(文本或二进制)。 resultFormat 返回结果格式(文本或二进制)。
  • 原型 PGresult* PQexecParams(PGconn* conn, const char* command, int nParams, const Oid* paramTypes, const char* const* paramValues, const int* paramLengths, const int* paramFormats, int resultFormat);
  • 注意事项 状态可以是多个值之一。但是,在异步连接过程之外只能看到其中两个:CONNECTION_OK和CONNECTION_BAD。与数据库的良好连接状态为CONNECTION_OK。状态表示连接尝试失败CONNECTION_BAD。通常,“正常”状态将一直保持到PQfinish,但通信失败可能会导致状态过早变为CONNECTION_BAD。在这种情况下,应用程序可以尝试通过调用进行恢复PQreset。
  • 返回值 ConnStatusType:连接状态的枚举,包括: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 CONNECTION_STARTED 等待进行连接。 CONNECTION_MADE 连接成功;等待发送。 CONNECTION_AWAITING_RESPONSE 等待来自服务器的响应。 CONNECTION_AUTH_OK 已收到认证;等待后端启动结束。 CONNECTION_SSL_STARTUP 协商SSL加密。 CONNECTION_SETENV 协商环境驱动的参数设置。 CONNECTION_OK 连接正常。 CONNECTION_BAD 连接故障。
  • 原型 PGconn *PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, const char *pgtty, const char *dbName, const char *login, const char *pwd);
  • 参数 表1 PQsetdbLogin参数 关键字 参数说明 pghost 要连接的主机名,详见连接参数说明章节描述的host字段。 pgport 主机服务器的端口号,详见连接参数说明描述的port字段。 pgoptions 添加命令行选项以在运行时发送到服务器,详见连接参数说明描述的options字段。 pgtty 忽略(以前,这个选项声明服务器日志的输出方向)。 dbName 要连接的数据库名,详见连接参数说明描述的dbname字段。 login 要连接的用户名,详见连接参数说明章节描述的user字段。 pwd 如果服务器要求口令认证,所用的口令,详见连接参数说明描述的password字段。
  • 数据库连接控制函数 数据库连接控制函数控制与数据库服务器的连接。一个应用程序一次可以与多个服务器建立连接,如一个客户端连接多个数据库的场景。每个连接都是用一个从函数PQconnectdb、PQconnectdbParams或PQsetdbLogin获得的PGconn对象表示。注意,这些函数总是返回一个非空的对象指针,除非内存分配失败,会返回一个空的指针。连接建立的接口保存在PGconn对象中,可以调用PQstatus函数来检查返回值看看连接是否成功。 PQconnectdbParams PQconnectdb PQconninfoParse PQconnectStart PQerrorMessage PQsetdbLogin PQfinish PQreset PQstatus 父主题: libpq接口参考
  • 执行SQL语句 通过连接对象,使用PQexec函数执行SQL查询语句。可以执行各种类型的SQL查询,例如SELECT查询、插入数据、更新数据、删除数据等。但如果同时执行多个SQL语句作为一个事务,应该使用事务控制功能,例如执行BEGIN、COMMIT、ROLLBACK 等SQL语句来控制事务的开始、提交和回滚。同时也需要注意执行SQL查询后的错误处理。 示例如下(完整示例请参考数据库建连、执行SQL并返回结果): /* * 连接成功后 * 测试实例涉及游标的使用时候必须使用事务块 * 把全部放在一个 "select * from pg_database" * PQexec() 里,过于简单,不推荐使用 */ /* 开始一个事务块 */ res = PQexec(conn, "BEGIN"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); } /* * 在结果不需要的时候PQclear PGresult,以避免内存泄漏 */ PQclear(res); /* * 从系统表 pg_database(数据库的系统目录)里抓取数据 */ res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); } PQclear(res); res = PQexec(conn, "FETCH ALL in myportal"); if (PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); } 父主题: 开发步骤
共100000条