PostgreSql-学习06-libpq之同步命令处理
目录
一、环境
二、介绍
三、函数
1、PQsetdbLogin
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
2、PQfinish
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
3、PQreset
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
4、PQstatus
(1)作用
(2)声明
(3)参数介绍
(4)返回值
5、PQserverVersion
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
6、PQerrorMessage
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
7、PQbackendPID
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
8、PQprepare
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
9、PQresultStatus
(1)作用
(2)声明
(3)参数介绍
(4)返回值
10、PQclear
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
11、PQntuples
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
12、PQnfields
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
13、PQfname
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
14、PQftable
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
15、PQftype
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
16、PQfmod
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
17、PQfsize
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
18、PQgetvalue
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
19、PQgetisnull
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
20、PQnparams
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
21、PQparamtype
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
22、PQcmdTuples
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
23、PQexecPrepared
(1)作用
(2)声明
(3)参数介绍
(4)检测成功与否
四、封装Demo测试
1、Demo
2、测试效果
本文参考《PostgreSQL 15.7 手册之客户端接口》。
一、环境
名称 | 描述 |
PG | PostgreSQL 16.3 |
CPU | Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz |
OS | CentOS Linux release 7.9.2009 (Core) |
二、介绍
libpq是应用程序员使用PostgreSQL的C接口。libpq是一个库函数的集合,它们允许客户端程序传递查询给PostgreSQL后端服务器并且接收这些查询的结果。
libpq也是很多其他PostgreSQL应用接口的底层引擎,包括为 C++、Perl、Python、Tcl 和 ECPG编写的接口。
三、函数
libpq接口函数较多,本文只介绍自己封装用到的。
1、PQsetdbLogin
(1)作用
开启一个到数据库服务器的新连接。
(2)声明
PGconn *PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, const char *pgtty, const char *dbName, const char *login, const char *pwd)
(3)参数介绍
参数名 | 描述 |
pghost | IP地址 |
pgport | 数据库端口号 |
pgoptions | 指定连接开始时发送到服务器的命令行选项。例如,将其设置为-c geqo=off 会将会话的geqo 参数的值设置为off 。 此字符串中的空格被视为分隔命令行参数,除非用反斜杠(\ )转义;写\\ 表示字面上的反斜杠。 |
pgtty | 已被弃用 |
dbName | 数据库名 |
login | 数据库用户名 |
pwd | 数据库密码 |
(4)检测成功与否
见PQstatus函数。
2、PQfinish
(1)作用
关闭与服务器的连接。同时释放PGconn
对象使用的内存。
注意,即使与服务器的连接尝试失败(由PQstatus指示),应用也应当调用PQfinish来释放PGconn
对象使用的内存。不能在调用PQfinish之后再使用PGconn
指针。
(2)声明
void PQfinish(PGconn *conn)
(3)参数介绍
参数名 | 描述 |
conn | 数据库连接结构体指针 |
(4)检测成功与否
无
3、PQreset
(1)作用
重置与服务器的通讯通道。
(2)声明
void PQreset(PGconn *conn)
(3)参数介绍
参数名 | 描述 |
conn | 数据库连接结构体指针 |
(4)检测成功与否
无
4、PQstatus
(1)作用
返回该连接的状态。
(2)声明
ConnStatusType PQstatus(const PGconn *conn)
(3)参数介绍
参数名 | 描述 |
conn | 数据库连接结构体指针 |
(4)返回值
宏 | 描述 |
CONNECTION_OK | 数据库连接状态正常 |
CONNECTION_BAD | 数据库连接状态非正常 |
CONNECTION_STARTED | 等待连接建立 |
CONNECTION_MADE | 连接正常;等待发送 |
CONNECTION_AWAITING_RESPONSE | 等待来自postmaster的响应 |
CONNECTION_AUTH_OK | 收到认证信息;等待后端启动 |
CONNECTION_SETENV | 此状态不再使用 |
CONNECTION_SSL_STARTUP | 正在协商SSL |
CONNECTION_NEEDED | 内部状态:需要connect() |
CONNECTION_CHECK_WRITABLE | 检查会话是否为读写 |
CONNECTION_CONSUME | 消耗任何额外的消息 |
CONNECTION_GSS_STARTUP | 正在协商GSSAPI |
CONNECTION_CHECK_TARGET | 检查目标服务器属性 |
CONNECTION_CHECK_STANDBY | 检查服务器是否处于备用模式 |
5、PQserverVersion
(1)作用
返回一个表示服务器版本的整数。
(2)声明
int PQserverVersion(const PGconn *conn)
(3)参数介绍
参数名 | 描述 |
conn | 数据库连接结构体指针 |
(4)检测成功与否
无。
6、PQerrorMessage
(1)作用
返回连接上的一个操作最近产生的错误消息。
几乎所有的libpq在失败时都会为PQerrorMessage设置一个消息。 注意按照libpq习惯,一个非空PQerrorMessage结果由多行构成,并且将包括一个尾部新行。 调用者不应该直接释放结果。当相关的PGconn
句柄被传递给PQfinish时,它将被释放。在PGconn
结构上的多个操作之间,不能指望结果字符串会保持不变。
(2)声明
char *PQerrorMessage(const PGconn *conn)
(3)参数介绍
参数名 | 描述 |
conn | 数据库连接结构体指针 |
(4)检测成功与否
无
7、PQbackendPID
(1)作用
返回处理这个连接的后端进程的进程ID(PID)。
后端PID有助于调试目的并且可用于与NOTIFY
消息(它包括发出提示的后端进程的PID)进行比较。注意PID属于一个在数据库服务器主机上执行的进程,而不是本地主机进程!
(2)声明
int PQbackendPID(const PGconn *conn)
(3)参数介绍
参数名 | 描述 |
conn | 数据库连接结构体指针 |
(4)检测成功与否
无
8、PQprepare
(1)作用
提交一个请求用给定参数创建一个预备语句并且等待完成。
PQprepare创建一个后面会由PQexecPrepared执行的预备语句。 这个特性允许命令被反复执行而无需每次都进行解析和规划。
该函数从query串创建一个名为stmtName的预备语句,该串必须包含一个单一 SQL 命令。 stmtName可以是""来创建一个未命名语句,在这种情况下任何已存在未命名语句将被自动替换。 如果语句名称已经在当前会话中被定义,则是一种错误。如果使用了任何参数,它们在查询中以$1、$2等引用。 nParams是参数的个数,其类型在数组paramTypes[]中被预先指定(当nParams为零时,该数组指针可以是NULL)。 paramTypes[]通过 OID 指定要赋予给参数符号的数据类型。 如果paramTypes是NULL或者该数组中任何特定元素为零,服务器会用对待未知类型文字串的方式为参数符号推测一种数据类型。 还有,查询能够使用编号高于nParams的参数符号,它们的数据类型也会被自动推测(找出推测出的数据类型的方法见PQdescribePrepared)。
正如PQexec一样,结果通常是一个PGresult对象,其内容代表服务器端成功或失败。 一个空结果表示内存不足或者根本无法发送命令。关于错误的更多信息请见PQerrorMessage。
用于PQexecPrepared的预备语句也能通过执行 SQL PREPARE语句来创建。 还有,尽管没有libpq函数来删除一个预备语句,SQL DEALLOCATE语句可被用于此目的。
(2)声明
PGresult *PQprepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes)
(3)参数介绍
参数名 | 描述 |
conn | 数据库连接结构体指针 |
stmtName | 语句句柄名 |
query | 执行语句 |
nParams | 参数个数 |
paramTypes | 参数类型 |
(4)检测成功与否
见PQresultStatus函数。
9、PQresultStatus
(1)作用
返回该命令的结果状态。
如果结果状态是PGRES_TUPLES_OK
或者PGRES_SINGLE_TUPLE
,那么下面所描述的函数能被用来检索该查询所返回的行。注意,一个恰好检索零行的SELECT
命令仍然会显示PGRES_TUPLES_OK
。PGRES_COMMAND_OK
用于从不返回行的命令(不带RETURNING
子句的INSERT
或者UPDATE
等)。一个PGRES_EMPTY_QUERY
可能表示客户端软件中的一个缺陷。
一个状态为PGRES_NONFATAL_ERROR
的结果将不会被PQexec或者其他查询执行函数直接返回,这类结果将被传递给提示处理器。
(2)声明
ExecStatusType PQresultStatus(const PGresult *res)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
(4)返回值
宏 | 描述 |
PGRES_EMPTY_QUERY | 发送给服务器的字符串为空。 |
PGRES_COMMAND_OK | 一个不返回数据的命令成功完成。 |
PGRES_TUPLES_OK | 一个返回数据的命令(例如SELECT 或者SHOW )成功完成。 |
PGRES_COPY_OUT | 从服务器复制出数据的传输开始。 |
PGRES_COPY_IN | 复制数据到服务器的传输开始。 |
PGRES_BAD_RESPONSE | 从后端收到意外响应 |
PGRES_NONFATAL_ERROR | 发生了一次非致命错误(一个提示或警告)。 |
PGRES_FATAL_ERROR | 发生了一次致命错误。 |
PGRES_COPY_BOTH | 向服务器复制数据/从服务器复制数据的传输开始。这个特性当前只被用于流复制,因此这个状态应该不会在普通应用中出现。 |
PGRES_SINGLE_TUPLE | PGresult 包含来自于当前命令的一个单一结果元组。这个状态只在查询选择了单一行模式时发生 |
PGRES_PIPELINE_SYNC | PGresult 表示管道模式中的同步点,由PQpipelineSync请求。 此状态仅在选择管道模式时发生。 |
PGRES_PIPELINE_ABORTED | PGresult 表示从服务器接收到错误的管道。 PQgetResult 必须被重复调用,并且每次它都会返回这个状态码,直到当前管道结束,此时它将返回PGRES_PIPELINE_SYNC ,并且正常的处理可以继续。 |
10、PQclear
(1)作用
释放与一个PGresult
相关的内存。
每一个命令结果不再需要时应该用PQclear释放。
你可以按照需要保留PGresult对象,当你发出一个新命令时它也不会消失,甚至关闭连接时也不会消失。 要去掉它,你必须调用PQclear。没有这样做将会导致在应用中的内存泄露。
(2)声明
void PQclear(PGresult *res)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
(4)检测成功与否
无
11、PQntuples
(1)作用
返回查询结果中的行(元组)数(注意,PGresult
对象被限制为不超过INT_MAX
行,因此一个int
结果就足够了)。
(2)声明
int PQntuples(const PGresult *res)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
(4)检测成功与否
无
12、PQnfields
(1)作用
返回查询结果中每一行的列(域)数。
(2)声明
int PQnfields(const PGresult *res)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
(4)检测成功与否
无
13、PQfname
(1)作用
返回与给定列号相关联的列名。
调用者不应该直接释放该结果。它将在相关的PGresult句柄被传递给PQclear之后被释放。
(2)声明
char *PQfname(const PGresult *res, int field_num)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
field_num | 列号,从 0 开始。 |
(4)检测成功与否
无
14、PQftable
(1)作用
返回给定列从中取出的表的 OID。列号从 0 开始。
如果列号超出范围或者指定的列不是对一个表列的简单引用时,返回InvalidOid
。 你可以查询系统表pg_class
来确定究竟是哪个表被引用。
当你包括libpq头文件,类型oid
以及常数InvalidOid
将被定义。它们将都是某种整数类型。
(2)声明
Oid PQftable(const PGresult *res, int field_num)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
field_num | 列号,从 0 开始。 |
(4)检测成功与否
无
15、PQftype
(1)作用
返回与给定列号相关联的数据类型。被返回的整数是该类型的内部 OID 号。列号从 0 开始。
你可以查询系统表pg_type
来得到多个数据类型的名字和属性。 内建数据类型的OID被定义在PostgreSQL安装的include
目录中的catalog/pg_type_d.h
文件中。
(2)声明
Oid PQftype(const PGresult *res, int field_num)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
field_num | 列号,从 0 开始。 |
(4)检测成功与否
无
16、PQfmod
(1)作用
返回与给定列号相关联的列的修饰符类型。列号从 0 开始。
修饰符值的解释是与类型相关的,它们通常指示精度或尺寸限制。值 -1 被用来指示“没有信息可用”。大部分的数据类型不适用修饰符,在那种情况中值总是 -1。
(2)声明
int PQfmod(const PGresult *res, int field_num)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
field_num | 列号,从 0 开始。 |
(4)检测成功与否
无
17、PQfsize
(1)作用
返回与给定列号相关的列的尺寸(以字节计)。列号从 0 开始。
PQfsize返回在一个数据库行中为这个列分配的空间,换句话说是服务器对该数据类型的内部表示的尺寸(因此,它对客户端并不是真地非常有用)。一个负值指示该数据类型是变长的。
(2)声明
int PQfsize(const PGresult *res, int field_num)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
field_num | 列号,从 0 开始。 |
(4)检测成功与否
无
18、PQgetvalue
(1)作用
返回一个PGresult
的一行的单一域值。行和列号从 0 开始。调用者不应该直接释放该结果。 它将在相关的PGresult
句柄被传递给PQclear之后被释放。
对于文本格式的数据,PQgetvalue返回的值是该域值的一种空值结束的字符串表示。对于二进制格式的数据,该值是由该数据类型的typsend
和typreceive
函数决定的二进制表示(在这种情况下该值实际上也跟随着一个零字节,但是这通常没有用处,因为该值很可能包含嵌入的空)。
如果该域值为空,则返回一个空串。关于区分空值和空字符串值请见PQgetisnull。
PQgetvalue返回的指针指向作为PGresult
结构一部分的存储。我们不应该修改它指向的数据,并且如果要在超过PGresult
结构本身的生命期之外使用它,我们必须显式地把该数据拷贝到其他存储中。
(2)声明
char *PQgetvalue(const PGresult *res, int tup_num, int field_num)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
tup_num | 行号,从 0 开始。 |
field_num | 列号,从 0 开始。 |
(4)检测成功与否
无
19、PQgetisnull
(1)作用
测试一个域是否为空值。行号和列号从 0 开始。
如果该域是空,这个函数返回 1。如果它包含一个非空值,则返回 0(注意PQgetvalue将为一个空域返回一个空串,不是一个空指针)。
(2)声明
int PQgetisnull(const PGresult *res, int tup_num, int field_num)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
tup_num | 行号,从 0 开始。 |
field_num | 列号,从 0 开始。 |
(4)检测成功与否
无
20、PQnparams
(1)作用
返回一个预备语句的参数数量。
只有在查看PQdescribePrepared的结果时,这个函数才有用。对于其他类型的查询,它将返回零。
(2)声明
int PQnparams(const PGresult *res)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
(4)检测成功与否
无
21、PQparamtype
(1)作用
返回所指示的语句参数的数据类型。参数号从 0 开始。
只有在查看PQdescribePrepared的结果时,这个函数才有用。对于其他类型的查询,它将返回零。
(2)声明
Oid PQparamtype(const PGresult *res, int param_num)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
param_num | 参数号,从 0 开始。 |
(4)检测成功与否
无
22、PQcmdTuples
(1)作用
返回受该 SQL 命令影响的行数。
该函数返回一个字符串,其中包含由生成PGresult
的SQL语句影响的行数。 该函数只能在执行SELECT
、CREATE TABLE AS
、 INSERT
、UPDATE
、DELETE
、 MERGE
、MOVE
、FETCH
或COPY
语句, 或包含INSERT
、UPDATE
、DELETE
或MERGE
语句的预处理查询的EXECUTE
之后使用。 如果生成PGresult
的命令是其他任何命令,PQcmdTuples将返回一个空字符串。 调用者不应直接释放返回值。当关联的PGresult
句柄传递给PQclear时,它将被释放。
(2)声明
char *PQcmdTuples(PGresult *res)
(3)参数介绍
参数名 | 描述 |
res | 结构体指针 |
(4)检测成功与否
无
23、PQexecPrepared
(1)作用
发送一个请求来执行一个带有给定参数的预处理语句,并等待结果。
PQexecPrepared类似于PQexecParams, 但要执行的命令是通过指定先前准备好的语句来指定,而不是提供查询字符串。 此功能允许重复使用的命令只被解析和计划一次,而不是每次执行时都要进行。 该语句必须在当前会话中先前准备好。
参数与PQexecParams相同,只是给出了预处理语句的名称而不是查询字符串, 并且paramTypes[]
参数不存在(因为在创建预处理语句时已确定了参数类型)。
(2)声明
PGresult *PQexecPrepared(PGconn *conn, const char *stmtName, int nParams, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
(3)参数介绍
参数名 | 描述 |
conn | 数据库连接结构体 |
stmtName | 句柄名 |
nParams | 参数个数 |
paramValues | 参数值 |
paramLengths | 参数长度 |
paramFormats | 指定参数是否为文本(在参数相应的数组项中放一个零)或二进制(在参数相应的数组项中放一个一)。如果该数组指针为空,那么所有参数都会被假定为文本串。 以二进制格式传递的值要求后端所期待的内部表示形式的知识。例如,整数必须以网络字节序被传递。传递numeric值要求关于服务器存储格式的知识,正如src/backend/utils/adt/numeric.c::numeric_send()以及src/backend/utils/adt/numeric.c::numeric_recv()中所实现的。 |
resultFormat | 指定零来得到文本格式的结果,或者指定一来得到二进制格式的结果(目前没有规定要求以不同格式得到不同的结果列,尽管在底层协议中这是可以实现的)。 |
(4)检测成功与否
无
四、封装Demo测试
1、Demo
#include "PgDb.h"#define TEST_PARAM_NUMS 100
#define TEST_PARAM_DATA_LEN 30
#define TEST_DATA_ROWS 3
#define TEST_DATA_COLS 8
#define TEST_DATA_SIZE 50
#define TEST_DELIMITER '|'
#define TEST_NULL ""
#define TEST_QUTO '"'
#define TEST_ESCAPE '\\'Status main()
{LOG_LEVEL = Debug;MyPgSt *PgSt = NULL;PgConnSt PgConnInfo = PG_CONN_ST_INIT("192.168.142.12","5432","","czg","postgres","postgres","UTF8");CopyStr *Sql = NULL;int ParamNums;char **ParamValues = (char **)MyMalloc(sizeof(char *) * TEST_PARAM_NUMS);int i;int j;Status MyStatus = FAIL_FLAG;for ( ParamNums = 0; ParamNums < TEST_PARAM_NUMS; ParamNums++){ParamValues[ParamNums] = (char *)MyMalloc(sizeof(char) * TEST_PARAM_DATA_LEN);}InitCopyStr(&Sql); PgInit(&PgSt);if (PgConn(&PgConnInfo,PgSt) != SUCCESS_FLAG){goto ERR_PHASE;}/*同步函数测试*//*开启事务,也就相当于非自动提交*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"BEGIN;\n");if (PG_EXEC_SQL(PgSt,Sql->String) != SUCCESS_FLAG){goto ERR_PHASE;}/*执行查询SQL文本DDL*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"\n\
CREATE TABLE IF NOT EXISTS PUBLIC.TESTTAB(\n\A SERIAL PRIMARY KEY ,\n\B DOUBLE PRECISION ,\n\C CHARACTER VARYING(100) ,\n\D TEXT ,\n\E BYTEA ,\n\F BYTEA ,\n\G DATE ,\n\H TIMESTAMP WITHOUT TIME ZONE ,\n\I NUMERIC(10,2) );\n");if (PG_EXEC_SQL(PgSt,Sql->String) != SUCCESS_FLAG){goto ERR_PHASE;}/*执行COPY文本*/PG_COPY_SPLICING(Sql,"PUBLIC","TESTTAB","B,C,D,E,F,G,H,I","FROM","'/home/postgres/PgData.txt'","CSV",TEST_DELIMITER,TEST_NULL,TEST_QUTO,TEST_ESCAPE);if (PG_EXEC_SQL(PgSt,Sql->String) != SUCCESS_FLAG){goto ERR_PHASE;}/*执行查询SQL文本DQL*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"SELECT * FROM PUBLIC.TESTTAB ORDER BY A DESC LIMIT 10;\n");if (PG_EXEC_SQL(PgSt,Sql->String) != SUCCESS_FLAG){goto ERR_PHASE;}PgResDataPrint(PgSt, Debug);PG_DQL_FREE(PgSt);/*执行插入SQL文本*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES(2.1,'LXG''ZXJ|CLX','HAHHAHAH','AAAAAA','BBBBBBBBBBBB','2024-08-19','2024-08-19',8);\n");if (PG_EXEC_SQL(PgSt,Sql->String) != SUCCESS_FLAG){goto ERR_PHASE;}/*执行查询SQL绑定变量方式*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;\n");ParamNums = 1;strcpy(ParamValues[0],"1.1");if (PG_EXEC_SQL_PREPARE(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues) != SUCCESS_FLAG){goto ERR_PHASE;}PgResDataPrint(PgSt, Debug);PG_DQL_FREE(PgSt);/*执行查询SQL绑定变量方式,复用上一次的解析结果*/ParamNums = 1;strcpy(ParamValues[0],"3.1");if (PG_EXEC_SQL_REUSE(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues) != SUCCESS_FLAG){goto ERR_PHASE;}PgResDataPrint(PgSt, Debug);PG_DQL_FREE(PgSt);/*执行插入SQL绑定变量方式*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES($1,$2,$3,$4,$5,$6,$7,$8),($9,$10,$11,$12,$13,$14,$15,$16);\n");ParamNums = 16;const char * const ParamValues3[] = {"4.1","LXG''ZXJ|CLX","HAHHAHAH","AAAAAA","BBBBBBBBBBBB","2024-08-19","2024-08-19","8","5.1","LXG''ZXJ|CLX","HAHHAHAH","AAAAAA","BBBBBBBBBBBB","2024-08-19","2024-08-19","8"};for ( i = 0; i < ParamNums; i++){strcpy(ParamValues[i],ParamValues3[i]);}if (PG_EXEC_SQL_PREPARE(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues) != SUCCESS_FLAG){goto ERR_PHASE;}/*执行插入SQL绑定变量方式,复用解析*/ParamNums = 16;const char * const ParamValues4[] = {"6.1","LXG''ZXJ|CLX","HAHHAHAH","AAAAAA","BBBBBBBBBBBB","2024-08-19","2024-08-19","8","7.1","LXG''ZXJ|CLX","HAHHAHAH","AAAAAA","BBBBBBBBBBBB","2024-08-19","2024-08-19","8"};for ( i = 0; i < ParamNums; i++){strcpy(ParamValues[i],ParamValues4[i]);}if (PG_EXEC_SQL_REUSE(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues) != SUCCESS_FLAG){goto ERR_PHASE;}/*异步函数测试*//*执行插入SQL文本*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES(2.1,'LXG''ZXJ|CLX','HAHHAHAH','AAAAAA','BBBBBBBBBBBB','2024-08-19','2024-08-19',8);\n");MyStatus = PG_EXEC_SQL_ASYNC(PgSt,Sql->String);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*执行查询SQL绑定变量方式*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;\n");ParamNums = 1;strcpy(ParamValues[0],"1.1");MyStatus = PG_EXEC_SQL_PREPARE_ASYNC(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}else if (MyStatus == SUCCESS_FLAG){PgResDataPrintAsync(PgSt, Debug);}/*执行查询SQL绑定变量方式,复用解析*/ParamNums = 1;strcpy(ParamValues[0],"3.1");MyStatus = PG_EXEC_SQL_REUSE_ASYNC(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}else if (MyStatus == SUCCESS_FLAG){PgResDataPrintAsync(PgSt, Debug);}/*执行COPY文本*/PG_COPY_SPLICING(Sql,"PUBLIC","TESTTAB","B,C,D,E,F,G,H,I","FROM","'/home/postgres/PgData.txt'","CSV",TEST_DELIMITER,TEST_NULL,TEST_QUTO,TEST_ESCAPE);MyStatus = PG_EXEC_SQL_ASYNC(PgSt,Sql->String);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*执行COPY IN文本,目前只有PG_EXEC_SQL_ASYNC支持*//*\进行转义,例如:"1LXG'ZXJ|\"CLX",这只是C定义的时候的时候需要。*//*\进行转义,例如:"\\x414141414141",第一个\是C定义的时候的时候需要。*/char CopyData[TEST_DATA_ROWS][TEST_DATA_COLS][TEST_DATA_SIZE] = \{{"18.1","1LXG'ZXJ|\"CLX","HAHHAHAH","\\x414141414141","","2024-08-19","2024-08-19 00:00:00","8.00"},{"18.1","2LXG'ZXJ|\"CLX","HAHHAHAH","\\x414141414141","\\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"},{"18.1","","HAHHAHAH","","\\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"}};/*测试demo,Data就不释放内存了,由系统自动释放,偷个懒。*/char ***Data = (char ***)MyMalloc(sizeof(char **) * TEST_DATA_ROWS);for ( i = 0; i < TEST_DATA_ROWS; i++){Data[i] = (char **)MyMalloc(sizeof(char *) * TEST_DATA_COLS);for ( j = 0; j < TEST_DATA_COLS; j++){Data[i][j] = (char *)MyMalloc(sizeof(char) * TEST_DATA_SIZE);strcpy(Data[i][j],CopyData[i][j]);}}Oid ColTypeArray[TEST_DATA_COLS] = {701,1043,25,17,17,1082,1114,1700};PG_COPY_SPLICING(Sql,"PUBLIC","TESTTAB","B,C,D,E,F,G,H,I","FROM","STDIN","CSV",TEST_DELIMITER,TEST_NULL,TEST_QUTO,TEST_ESCAPE);MyStatus = PG_EXEC_SQL_ASYNC(PgSt,Sql->String);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}MyStatus = PgCopyIn(PgSt,Data,TEST_DATA_ROWS,TEST_DATA_COLS,TEST_DELIMITER,TEST_NULL,TEST_QUTO,TEST_ESCAPE,ColTypeArray);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}MyStatus = PgCopyInEnd(PgSt);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*执行提交SQL文本*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"COMMIT;\n");MyStatus = PG_EXEC_SQL_ASYNC(PgSt,Sql->String);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*测试某库某模式下所有主键表获取*/MyStatus = PgSchemaPkGet(PgSt,"czg","public");if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}else if (MyStatus == SUCCESS_FLAG){PgResDataPrintAsync(PgSt, Debug);}/*测试某库某模式下主键表获取*/MyStatus = PgTabPkGet(PgSt,"czg","public","testtab");if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}else if (MyStatus == SUCCESS_FLAG){PgResDataPrintAsync(PgSt, Debug);}/*测试PG根据主键切分表,返回主键最大值,最小值,步长等信息。*/PgPkSplitSt PkSplitInfo;MyStatus = PgTabPkSplit(PgSt,"a","public","testtab","",6,&PkSplitInfo);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*测试PG计算单表条数。*/MyStatus = PgCntSingleTab(PgSt,"public","testtab","",&i);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*测试PG导出文本。*/PG_COPY_SPLICING(Sql,"PUBLIC","TESTTAB","B,C,D,E,F,G,H,I","TO","'/home/postgres/PgDataOut.txt'","CSV",TEST_DELIMITER,TEST_NULL,TEST_QUTO,TEST_ESCAPE);MyStatus = PG_EXEC_SQL_ASYNC(PgSt,Sql->String);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*释放内存资源*/
ERR_PHASE:DestroyCopyStr(&Sql); PgDestroy(&PgSt);for ( ParamNums = 0; ParamNums < TEST_PARAM_NUMS; ParamNums++){free(ParamValues[ParamNums]);ParamValues[ParamNums] = NULL;}free(ParamValues);ParamValues = NULL;return MyStatus;
}
2、测试效果
下一次和大家分享一下异步模式,Demo中对异步命令处理进行封装,获取元数据阶段是同步的,执行SQL,获取查询数据等都是异步处理的。
[gbase@czg2 Exec]$ ./TestPg
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgInit : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query : SELECT PG_CATALOG.SET_CONFIG('search_path', '', false);
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 0.001 s, Affect 0 Rows.(SELECT,SHOW)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 1
AffectRows : 0
ID ColName ColType ColTypeSize ColMod TabOid
0 set_config 25 -1 -1 0
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgParamSet : OK, ParamName : 'search_path', ParamVal : '', ParamLv : 0
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgConn : OK, Host : '192.168.142.12', User : 'postgres', Db : 'czg', Port : '5432', Encode : 'UTF8', BackendPid : 33856, PqlibV : 160003, PgV : 160003, PqThrdSafe : 1.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query : BEGIN;
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql : OK, Sql Elapsed Time 0.000 s, Affect 0 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 0
AffectRows : 0
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query :
CREATE TABLE IF NOT EXISTS PUBLIC.TESTTAB(A SERIAL PRIMARY KEY ,B DOUBLE PRECISION ,C CHARACTER VARYING(100) ,D TEXT ,E BYTEA ,F BYTEA ,G DATE ,H TIMESTAMP WITHOUT TIME ZONE ,I NUMERIC(10,2) );
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Warn ]-MyNoticeProcessor : OK, NOTICE: 42P07: relation "testtab" already exists, skipping
LOCATION: transformCreateStmt, parse_utilcmd.c:207
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql : OK, Sql Elapsed Time 0.001 s, Affect 0 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 0
AffectRows : 0
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query :
COPY PUBLIC.TESTTAB(B,C,D,E,F,G,H,I)FROM '/home/postgres/PgData.txt'WITH(FORMAT CSV,DELIMITER '|',NULL '',QUOTE '"',ESCAPE '\');
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql : OK, Sql Elapsed Time 0.002 s, Affect 10 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 0
AffectRows : 10
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query : SELECT * FROM PUBLIC.TESTTAB ORDER BY A DESC LIMIT 10;
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql : OK, Sql Elapsed Time 0.002 s, Affect 10 Rows.(SELECT,SHOW)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 10
ColNums : 9
AffectRows : 10
ID ColName ColType ColTypeSize ColMod TabOid
0 a 23 4 -1 16414
1 b 701 8 -1 16414
2 c 1043 -1 104 16414
3 d 25 -1 -1 16414
4 e 17 -1 -1 16414
5 f 17 -1 -1 16414
6 g 1082 4 -1 16414
7 h 1114 8 -1 16414
8 i 1700 -1 655366 16414
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgResDataPrint :
"2099372","9.1","0LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099371","9.1","9LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099370","9.1","8LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099369","9.1","7LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099368","9.1","6LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099367","9.1","5LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099366","9.1","4LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099365","9.1","3LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099364","9.1","2LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099363","9.1","1LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242",NULL,"2024-08-19 00:00:00","8.00"
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query : INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES(2.1,'LXG''ZXJ|CLX','HAHHAHAH','AAAAAA','BBBBBBBBBBBB','2024-08-19','2024-08-19',8);
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql : OK, Sql Elapsed Time 0.001 s, Affect 1 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 0
AffectRows : 1
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query : SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql : OK, Sql Elapsed Time 0.002 s, Affect 10 Rows.(SELECT,SHOW)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 10
ColNums : 9
AffectRows : 10
ID ColName ColType ColTypeSize ColMod TabOid
0 a 23 4 -1 16414
1 b 701 8 -1 16414
2 c 1043 -1 104 16414
3 d 25 -1 -1 16414
4 e 17 -1 -1 16414
5 f 17 -1 -1 16414
6 g 1082 4 -1 16414
7 h 1114 8 -1 16414
8 i 1700 -1 655366 16414
ParamNums : 1
ParamType : [ 701 ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgResDataPrint :
"2097152","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097151","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097150","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097149","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097148","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097147","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097146","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097145","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097144","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097143","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query : SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql : OK, Sql Elapsed Time 0.233 s, Affect 0 Rows.(SELECT,SHOW)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgResDataPrint :
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query : INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES($1,$2,$3,$4,$5,$6,$7,$8),($9,$10,$11,$12,$13,$14,$15,$16);
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql : OK, Sql Elapsed Time 0.001 s, Affect 2 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 0
AffectRows : 2
ParamNums : 16
ParamType : [ 701,1043,25,17,17,1082,1114,1700,701,1043,25,17,17,1082,1114,1700 ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query : INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES($1,$2,$3,$4,$5,$6,$7,$8),($9,$10,$11,$12,$13,$14,$15,$16);
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql : OK, Sql Elapsed Time 0.001 s, Affect 2 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query : INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES(2.1,'LXG''ZXJ|CLX','HAHHAHAH','AAAAAA','BBBBBBBBBBBB','2024-08-19','2024-08-19',8);
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 0.001 s, Affect 1 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 0
AffectRows : 1
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query : SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 0.001 s, Affect 0 Rows.(SELECT,SHOW)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 9
AffectRows : 0
ID ColName ColType ColTypeSize ColMod TabOid
0 a 23 4 -1 16414
1 b 701 8 -1 16414
2 c 1043 -1 104 16414
3 d 25 -1 -1 16414
4 e 17 -1 -1 16414
5 f 17 -1 -1 16414
6 g 1082 4 -1 16414
7 h 1114 8 -1 16414
8 i 1700 -1 655366 16414
ParamNums : 1
ParamType : [ 701 ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgResDataPrintAsync:
"2097152","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097151","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097150","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097149","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097148","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097147","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097146","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097145","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097144","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097143","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
RowNums : 10
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query : SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 0.214 s, Affect 0 Rows.(SELECT,SHOW,No Data)
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query :
COPY PUBLIC.TESTTAB(B,C,D,E,F,G,H,I)FROM '/home/postgres/PgData.txt'WITH(FORMAT CSV,DELIMITER '|',NULL '',QUOTE '"',ESCAPE '\');
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 0.000 s, Affect 10 Rows. (DML,DDL,COPY)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 0
AffectRows : 10
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query :
COPY PUBLIC.TESTTAB(B,C,D,E,F,G,H,I)FROM STDINWITH(FORMAT CSV,DELIMITER '|',NULL '',QUOTE '"',ESCAPE '\');
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 0.001 s, Affect 0 Rows.(SELECT,SHOW,COPY IN)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 0
AffectRows : 0
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgCopyIn : OK, RowNums : 3.
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgCopyInEnd : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query : COMMIT;
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 0.001 s, Affect 0 Rows. (DML,DDL,COPY)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 0
AffectRows : 0
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query :
SELECTPkTab.TABLE_NAME,STRING_AGG(PkTab.COLUMN_NAME,'|'),STRING_AGG(ColTab.DATA_TYPE,'|'),COUNT(PkTab.COLUMN_NAME)
FROM
(SELECTTABLE_CATALOG,TABLE_SCHEMA ,TABLE_NAME ,COLUMN_NAMEFROMINFORMATION_SCHEMA.KEY_COLUMN_USAGEWHERETABLE_CATALOG = $1ANDTABLE_SCHEMA = $2ANDPOSITION_IN_UNIQUE_CONSTRAINT IS NULLORDER BY ORDINAL_POSITION
) PkTab
LEFT JOIN
(SELECTTABLE_CATALOG,TABLE_SCHEMA ,TABLE_NAME ,COLUMN_NAME ,DATA_TYPEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_CATALOG = $3ANDTABLE_SCHEMA = $4
) ColTab
ONPkTab.TABLE_CATALOG = ColTab.TABLE_CATALOG
ANDPkTab.TABLE_SCHEMA = ColTab.TABLE_SCHEMA
ANDPkTab.TABLE_NAME = ColTab.TABLE_NAME
ANDPkTab.COLUMN_NAME = ColTab.COLUMN_NAME
GROUP BYPkTab.TABLE_NAME;
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 0.021 s, Affect 0 Rows.(SELECT,SHOW)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 4
AffectRows : 0
ID ColName ColType ColTypeSize ColMod TabOid
0 table_name 19 64 -1 14040
1 string_agg 25 -1 -1 0
2 string_agg 25 -1 -1 0
3 count 20 8 -1 0
ParamNums : 4
ParamType : [ 19,19,19,19 ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgSchemaPkGet : OK, czg.public.
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgResDataPrintAsync:
"students","id|name","integer|character varying","2"
"testtab","a","integer","1"
RowNums : 2
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query :
SELECTSTRING_AGG(PkTab.COLUMN_NAME,'|'),STRING_AGG(ColTab.DATA_TYPE,'|'),COUNT(PkTab.COLUMN_NAME)
FROM
(SELECTTABLE_CATALOG,TABLE_SCHEMA ,TABLE_NAME ,COLUMN_NAMEFROMINFORMATION_SCHEMA.KEY_COLUMN_USAGEWHERETABLE_CATALOG = $1ANDTABLE_SCHEMA = $2ANDTABLE_NAME = $3ANDPOSITION_IN_UNIQUE_CONSTRAINT IS NULLORDER BY ORDINAL_POSITION
) PkTab
LEFT JOIN
(SELECTTABLE_CATALOG,TABLE_SCHEMA ,TABLE_NAME ,COLUMN_NAME ,DATA_TYPEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_CATALOG = $4ANDTABLE_SCHEMA = $5ANDTABLE_NAME = $6
) ColTab
ONPkTab.TABLE_CATALOG = ColTab.TABLE_CATALOG
ANDPkTab.TABLE_SCHEMA = ColTab.TABLE_SCHEMA
ANDPkTab.TABLE_NAME = ColTab.TABLE_NAME
ANDPkTab.COLUMN_NAME = ColTab.COLUMN_NAME
GROUP BYPkTab.TABLE_NAME;
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 0.010 s, Affect 0 Rows.(SELECT,SHOW)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 3
AffectRows : 0
ID ColName ColType ColTypeSize ColMod TabOid
0 string_agg 25 -1 -1 0
1 string_agg 25 -1 -1 0
2 count 20 8 -1 0
ParamNums : 6
ParamType : [ 19,19,19,19,19,19 ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgTabPkGet : OK, czg.public.testtab
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgResDataPrintAsync:
"a","integer","1"
RowNums : 1
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query : SELECT MAX(a),MIN(a) FROM public.testtab
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 0.002 s, Affect 0 Rows.(SELECT,SHOW)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 2
AffectRows : 0
ID ColName ColType ColTypeSize ColMod TabOid
0 max 23 4 -1 0
1 min 23 4 -1 0
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgTabPkSplit : OK, Schema : public, Tab : testtab, Pk : a.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query : SELECT COUNT(*) FROM public.testtab
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 0.167 s, Affect 0 Rows.(SELECT,SHOW)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 1
AffectRows : 0
ID ColName ColType ColTypeSize ColMod TabOid
0 count 20 8 -1 0
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgCntSingleTab : OK, Schema : public, Tab : testtab, RowNums : 2098355.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query :
COPY PUBLIC.TESTTAB(B,C,D,E,F,G,H,I)TO '/home/postgres/PgDataOut.txt'WITH(FORMAT CSV,DELIMITER '|',NULL '',QUOTE '"',ESCAPE '\');
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet : OK.
2024-11-18 16:16:15-P[33855]-T[33855]-[Extra]-PgExecSqlAsync : OK, Elapsed Time 4.553 s, Affect 2098355 Rows. (DML,DDL,COPY)
2024-11-18 16:16:15-P[33855]-T[33855]-[Debug]-PgMetaDataPrint :
RowNums : 0
ColNums : 0
AffectRows : 2098355
ParamNums : 0
ParamType : [ ]
2024-11-18 16:16:15-P[33855]-T[33855]-[Debug]-PgDestroy : OK.
相关文章:
PostgreSql-学习06-libpq之同步命令处理
目录 一、环境 二、介绍 三、函数 1、PQsetdbLogin (1)作用 (2)声明 (3)参数介绍 (4)检测成功与否 2、PQfinish (1)作用 (2࿰…...
Python `str.strip()` 的高级用法详解
Python str.strip 的高级用法详解 1. str.strip() 的基本用法2. str.strip() 的高级用法2.1 移除指定字符2.2 移除多个指定字符2.3 移除换行符和制表符2.4 结合正则表达式的高级处理 3. lstrip() 和 rstrip() 的用法3.1 lstrip():移除左端字符3.2 rstrip()ÿ…...
Vue 3 中的 `update:modelValue` 事件详解
在 Vue 3 中,update:modelValue 事件通常与 v-model 指令一起使用,以实现自定义组件的双向数据绑定。以下是对该事件的详细分析: 事件定义 首先,我们需要在组件中定义 update:modelValue 事件。可以使用 defineEmits 函…...
AI 助力医学伦理知情同意书的完善:守护受试者权益
在医学研究中,知情同意书是保障受试者权益的核心文件,其质量直接关系到研究的伦理合规性。一份完善的知情同意书应清晰、准确且全面地向受试者传达研究的关键信息,确保他们在充分理解的基础上自愿做出参与决策。然而,在实际撰写过…...
【信息系统项目管理师-论文真题】2017上半年论文详解(包括解题思路和写作要点)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一:论信息系统项目的范围管理解题思路写作要点试题二:论项目采购管理解题思路写作要点试题一:论信息系统项目的范围管理 实施项目范围管理的目的是包括确保项目做且制作所需的全部工作,以顺利完成项目…...
rpc设计的再次思考20251215(以xdb为核心构建游戏框架)
1.服务提供者注册的方式 // 表明这是一个服务提供者,ServerType 和 ServerId从application.properties中读取 // 而且只有当当前服务是Game时,才生效。 或者 条件注解??? RpcProvider(typeServerType.Game) public class GameProvider{MsgReceiver…...
mysql 查看并设置 innodb_flush_log_at_trx_commit 参数
mysql 查看并设置 innodb_flush_log_at_trx_commit 参数 innodb_flush_log_at_trx_commit 是 MySQL 中的一个系统变量,用于控制 InnoDB 存储引擎的日志刷新行为。该变量有三个可选的值: 0:每隔一秒钟,日志缓冲被刷新到日志文件&a…...
spring使用rabbitmq当rabbitmq集群节点挂掉 spring rabbitmq怎么保证高可用,rabbitmq网络怎么重新连接
##spring rabbitmq代码示例 Controller代码 import com.alibaba.fastjson.JSONObject; import com.newland.mi.config.RabbitDMMQConfig; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageProperties; import org.springframewo…...
Java BigDecimal
1. BigDecimal 用于解决浮点型运算时,出现结果失真的问题。 2. BigDecimal创建的构造器、常用方法 构造器说明public BigDecimal(double val)---不推荐将double 类型转为BigDecimalpublic BigDecimal(String val)---推荐将String 类型转为BigDecimal 方法说明pub…...
RFMiD:多疾病检测的视网膜图像分析挑战|文献速递-生成式模型与transformer在医学影像中的应用
Title 题目 RFMiD: Retinal Image Analysis for multi-Disease Detection challenge RFMiD:多疾病检测的视网膜图像分析挑战 01 文献速递介绍 眼部疾病的普遍性与上升趋势 根据世界卫生组织 (WHO) 2019 年《全球视觉报告》,目前全球约有 22 亿人存…...
布隆过滤器
这篇博客我们来说一下布隆过滤器 之前我们在讲redis缓存穿透的时候说可以使用布隆过滤器来解决这个问题 那么我们先来简单复习一下什么时缓存穿透 (一)复习缓存穿透 我们都知道redis可以作为mysql的缓存帮忙抵挡大部分的请求,但是当redis中…...
构建一个rust生产应用读书笔记四(实战6)
本节我们开始使用tracing来记录日志,实际上在生产环境中,更推荐使用tracing作为日志记录的首先,它提供了更丰富的上下文信息和结构化日志记录功能。tracing 不仅可以记录日志信息,还可以跟踪函数调用、异步任务等,适用…...
如何使用git新建本地仓库并关联远程仓库的步骤(详细易懂)
一、新建本地仓库并关联远程仓库的步骤 新建本地仓库 打开终端(在 Windows 上是命令提示符或 PowerShell,在 Linux 和Mac上是终端应用),进入你想要创建仓库的目录。例如,如果你想在桌面上创建一个名为 “my - project”…...
5.最长回文字串
给你一个字符串 s,找到 s 中最长的 回文 子串 。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2: 输入:s "cbbd"…...
数据仓库工具箱—读书笔记02(Kimball维度建模技术概述02、事实表技术基础)
Kimball维度建模技术概述 记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣 第二章前言部分作者提到:技术的介绍应该通过涵盖各种行业的熟悉的用例展开(赞同…...
【C++】13___STL
一、基本概念 STL(Standard Template Library,标准模板库)STL从广义上分为:容器(container)、算法(algorithm)、迭代器(iterator)容器和算法之间通过迭代器进行无缝连接STL几乎所有的代码都采用了类模板或者函数模板 二、STL六大组件 分别是:容器、算法…...
在 Ubuntu 中启用 root 用户的远程登录权限
1. 概述:为什么需要启用 root 用户远程登录? 在 Ubuntu 中,出于安全原因,默认情况下 root 用户被禁止远程登录。然而,在某些情况下(如需要进行高权限操作的远程管理任务),启用 root…...
android 混淆
前沿 很久没用过混淆功能了,因为之前的包都使用第三方加固了,而且项目开发好几年了,突然要混淆也很麻烦。换了家公司后,感觉还是得混淆代码才行,不然直接暴露源码也太不行了。 启动混淆功能 isMinifyEnabled true …...
6、AI测试辅助-测试报告编写(生成Bug分析柱状图)
AI测试辅助-测试报告编写(生成Bug分析柱状图) 一、测试报告1. 创建测试报告2. 报告补充优化2.1 Bug图表分析 3. 风险评估 总结 一、测试报告 测试报告内容应该包含: 1、测试结论 2、测试执行情况 3、测试bug结果分析 4、风险评估 5、改进措施…...
让人工智能帮我写一个矩阵按键扫描程序
1.前言 嘉立创做了一块编程小车的蓝牙按键遥控器,按键是4*4矩阵的,通过蓝牙发送按键编码值给蓝牙小车(外围设备)。 原理图如下: 板子回来后,因为懒得写按键矩阵扫描程序,想想还是交给人工智能…...
基于MindSpore NLP的PEFT微调
创建notebook 登录控制台 创建notebook 如果出现提示按如下操作 回到列表页面创建notebook参数如下: 配置mindnlp环境 打开GitHub - mindspore-lab/mindnlp: Easy-to-use and high-performance NLP and LLM framework based on MindSpore, compatible with model…...
2024年12月CCF-GESP编程能力等级认证C++编程八级真题解析
本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 小杨家响应国家“以旧换新”政策,将自家的汽油车置换为新能源汽车,正在准备自编车牌。自编车牌包括5位数字或英文字母,要求…...
基于微信小程序的小区疫情防控ssm+论文源码调试讲解
第2章 程序开发技术 2.1 Mysql数据库 为了更容易理解Mysql数据库,接下来就对其具备的主要特征进行描述。 (1)首选Mysql数据库也是为了节省开发资金,因为网络上对Mysql的源码都已进行了公开展示,开发者根据程序开发需…...
moment()获取时间
moment 是一个 JavaScript 日期处理类库。 使用: //安装 moment npm install moment -- save引用 //在main.js中全局引入 import moment from "moment"设定moment区域为中国 //import 方式 import moment/locale/zh-cn moment.locale(zh-cn); 挂载全…...
CAD学习 day3
细节问题 快捷键X 分解单独进行操作如果需要制定字体样式选择 gdcbig.shx快捷键AA 算面积 平面布置图 客户沟通 - 会面笔记 - 客户需求(几个人居住、生活方式、功能需求(电竞房、家政柜)、书房、佛龛、儿童房、风格方向)根据客户需求 - 平面方案布置 (建议做三个以上方案) -…...
windows免登录linux
windows 生成秘钥文件 ssh-keygen -t rsa 将公钥传送到服务器 scp C:\Users\xx/.ssh/id_rsa.pub xxxx:/home/ruoyi/id_rsa.pub linux 使用ssh-copy-id -i ~/.ssh/id_rsa.pub userhost 如果禁用root登录,先开启 vim /etc/ssh/sshd_config PermitRootLogin yes …...
边缘计算的方式
做边缘计算这个行业要想赚得到收益,那一定要找到适合自己参与的一种方式。目前参与边缘计算的话,它主要有两个渠道。 第一个就是用盒子来跑,这个盒子的话包括光猫、路由器、摄像头等等,盒子是一条网线带动一个盒子,它…...
Android GO 版本锁屏声音无效问题
问题描述 Android go版本 在设置中打开锁屏音开关,息屏灭屏还是无声音 排查 vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\keyguard\KeyguardViewMediator.java private void setupLocked() {...String soundPath Settings.G…...
Android之RecyclerView显示数据列表和网格
一、RecyclerView的优势 RecyclerView 的最大优势在于,它对大型列表来说非常高效: 默认情况下,RecyclerView 仅会处理或绘制当前显示在屏幕上的项。例如,如果您的列表包含一千个元素,但只有 10 个元素可见࿰…...
汽车发动机电控系统-【传感器】篇
燃油:喷油控制(不多不少) 进气 主传感器MAP:进气压力传感器(微型车)、空气流量传感器MAF 辅助传感器:节气门传感器、水温传感器(提供暖机工况)、进气温度传感器 反馈…...
牛客周赛 Round 72 题解
本次牛客最后一个线段树之前我也没碰到过,等后续复习到线段树再把那个题当例题发出来 小红的01串(一) 思路:正常模拟,从前往后遍历一遍去统计即可 #include<bits/stdc.h> using namespace std; #define int lo…...
Python AI后台服务器
把数据训练放在后台,首先碰到的一个问题是如何高效地从数据库把数据请求下来。 分别试了几个库 modin 号称和pandas能够无缝衔接,试了下,确实pd.read_sql蛮快的,但是下来后数据格式就变了,不太好进行后续处理了conne…...
音视频入门基础:MPEG2-TS专题(19)——FFmpeg源码中,解析TS流中的PES流的实现
一、引言 FFmpeg源码在解析完PMT表后,会得到该节目包含的视频和音频信息,从而找到音视频流。TS流的音视频流包含在PES流中。FFmpeg源码通过调用函数指针tss->u.pes_filter.pes_cb指向的回调函数解析PES流的PES packet: /* handle one TS…...
Qt Q_ENUM enum 转 QString 枚举字符串互转; C++模板应用
Part1: Summary 项目中我们常用到命名,使用 enum 转成 string ,方便简洁;Qt给我们提供了一个很方便的功能 Q_ENUM,可以实现枚举字符串互转; Q_ENUM宏将枚举注册到元对象系统中; QMetaEnum::fromType获取枚…...
Mac配置 Node镜像源的时候报错解决办法
在Mac电脑中配置国内镜像源的时候报错,提示权限问题,无法写入配置文件。本文提供解决方法,青测有效。 一、原因分析 遇到的错误是由于 .npm 目录下的文件被 root 用户所拥有,导致当前用户无法写入相关配置文件。 二、解决办法 在终端输入以下命令,输入管理员密码即可。 su…...
windows C#-为枚举创建新方法
可使用扩展方法添加特定于某个特定枚举类型的功能。 示例 在下面的示例中,Grades 枚举表示学生可能在班里收到的字母等级分。 该示例将一个名为 Passing 的扩展方法添加到 Grades 类型中,以便该类型的每个实例现在都“知道”它是否表示合格的等级分。 …...
ISCTF复现-misc
File_Format 下载附件后用010打开查看文件头会发现是个exe文件 格式:文件描述(后缀名),文件头(hex):文件头标识(十六进制)PNG (png),文件头(hex):89504E47 PNGImageFile…...
知道一个服务器IP地址如果attack服务器地址
CSDN提醒:亲爱的用户:你好! 你的账号于2024-12-17 19:04:04在美国美国登录,登录IP为:47.238.159.124。若非本人登录,请及时修改密码。 莫名其妙显示美国登录了我的CSDN博客 卧槽 服务器的IP地址是一个用于…...
【泛微系统】查询角色所在流程操作组
查询角色所在流程操作组 -----sqlserver-------SELECT CASE WHEN a.workflowname LIKE ~`~`% THEN SUBSTRING(a.workflowname, CHARINDEX(`~`7, a.workflowname...
ceph的RGW对象存储网关部署和使用
RGW对象存储网关部署和使用 Rados GateWay简称rgw,底层采用亚马逊的S3作为对象存储实现。 参考链接: https://docs.ceph.com/en/reef/radosgw/ https://docs.ceph.com/en/reef/radosgw/bucketpolicy/ https://docs.aws.amazon.com/zh_cn/AmazonS3/lat…...
智慧公交指挥中枢,数据可视化 BI 驾驶舱
随着智慧城市的蓬勃发展,公共交通作为城市运营的核心枢纽,正朝着智能化和数据驱动的方向演进。通过整合 CAN 总线技术(Controller Area Network,控制器局域网总线)、车载智能终端、大数据分析及处理等尖端技术,构建的公交“大脑”…...
fastjson 字符串转对象 boolean类型字段转换失败
fastjson 字符串转对象 boolean类型字段转换失败 问题出现场景问题出现的原因问题解决方式1方式2 问题出现场景 有一个json字符串,需要将这个字符串转换为对象,字符串中有个字段是布尔类型,对应的value是true,使用阿里的fastjson…...
浏览器事件循环机制
JavaScript 是单线程运行的语言,同一时间只能执行一个任务。单线程意味着: 如果某个任务执行时间过长,后续任务会被阻塞。 同步任务和异步任务的调度需要一种机制来管理。 为了解决这个问题,事件循环应运而生,它可以…...
Redis缓存穿透与缓存击穿
Redis缓存穿透与缓存击穿 缓存穿透 在默认情况下,用户请求数据时,会先在缓存(Redis)中查找,若没找到即缓存未命中,再在数据库中进行查找,数量少可能问题不大,可是一旦大量的请求数据(例如秒杀…...
WEB自动化测试(selenium工具)框架、面试题
一、什么是web自动化测试 让程序员代替人为去验证web项目功能的过程 二、什么web项目适合自动化测试 1)需求变动不频繁 测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本&…...
Spring Boot 3.X:Unable to connect to Redis错误记录
一.背景 最近在搭建一个新项目,本着有新用新的原则,项目选择到了jdk17SpringBoot3.4。但是在测试Redis连接的时候却遇到了以下问题: redis连不上了。于是我先去检查了配置文件的连接信息,发现没问题;再去检查配置类&am…...
ISP算法之黑电平BLC校正
黑电平形成原因 Sensor本身问题 CMOS Sensor本身的电路会存在暗电流(dark current),在没有光照条件下,感光器件等也会存在流动的电流,在光敏二极管器的伏安特性曲线中反向截止区电流并不为零(如下图)。导致在Sensor遮…...
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(四)
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(四) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…...
【Python】利用函数模拟创建【栈】的数据结构操作
知识解读:来自:https://fishc.com.cn[#FwSB,M 9xKOA!^6fP)_EC(nsd什么是栈呢?Powered by https://fishc.com.cn3>A?5JXL#_}YBGD"FWdubKeyhQP栈是一种具有 FILO 特性的数据结构,即先放入的数据反而后取出。e&"%b…...
10 JVM内置锁
我们先想明白一个问题,什么是锁? 我们去给自己家锁门的时候,只有对应的一把钥匙能开锁。当用钥匙去开锁的时候,锁孔的内置型号会验证钥匙能不能对的上。能对上就能把锁打开,然后进到家里使用家里的资源。否则就在外面等…...