ホームページ データベース mysql チュートリアル 循序渐进PostgreSQL: 学习pqxx C++ API访问

循序渐进PostgreSQL: 学习pqxx C++ API访问

Jun 07, 2016 pm 05:23 PM

习惯了C++来开发的人,可能更倾向于使用c++库来访问PostgreSQL。libpqxx很早以前就推出了。目前已经到了4.0版。本文就简单的介绍

1. 简介

习惯了C++来开发的人,可能更倾向于使用c++库来访问PostgreSQL。libpqxx很早以前就推出了。目前已经到了4.0版。本文就简单的介绍如何使用它,,Linux平台编译相对简单,这里就介绍一下Windows平台下的使用。

libpqxx的下载地址:直接上这里

由于libpqxx对libpq的C-API进行了很好的封装,从而可以节省大量的编码时间。

2. 编译过程

将libpqxx解压到一固定目录。你需要提前编译好或安装好的客户端库,通常为了方便,这里假定你已经有一个PG的安装版或者解压缩版,在c:\pgsql里头。以PG9.x为例。

1. 进入libpqxx源码目录,备份并修改win32\common文件,将PGSQLSRC的值指向正确的地方:

这里是PGSQLSRC="c:\pgsql"

后边还有很多目录位置需要调整,针对我们这种情况,通常都是保留安装版本的设置,如:LIBPQINC=$(PGSQLSRC)\include, 而注释掉#LIBPQINC=$(PGSQLSRC)\interfaces\libpq, 其它几个值都如此类推。

2. 拷贝一些编译相关的头文件

针对具体版本,9.0的,将config\sample-headers\libpq\9.0\pqxx复制到include下边

针对VS2008的,将config\sample-headers\compiler\VisualStudio2008\pqxx复制到include目录下边, 如果是VS2005,以此类推。

3. 编译

program files->VS2008-->Visual studio tools->Visual Studio 2008 Command Prompt, 进入命令行, 在此进入libpqxx的源代码根目录,执行:

nmake /f win32\vc-libpqxx.mak ALL,

得到如下中间过程:

link.exe kernel32.lib ws2_32.lib advapi32.lib /nologo /dll /machine:I386 
 shell32.lib secur32.lib wldap32.lib /libpath:"C:\hisql-x86-2.0.1"\lib libpq.lib 
  "ObjDllRelease\binarystring.obj"  "ObjDllRelease\connection.obj"  "ObjDllRelea 
se\connection_base.obj"  "ObjDllRelease\cursor.obj"  "ObjDllRelease\dbtransactio 
n.obj"  "ObjDllRelease\errorhandler.obj"  "ObjDllRelease\except.obj"  "ObjDllRel 
ease\field.obj"  "ObjDllRelease\largeobject.obj"  "ObjDllRelease\nontransaction. 
obj"  "ObjDllRelease\notification.obj"  "ObjDllRelease\notify-listen.obj"  "ObjD 
llRelease\pipeline.obj"  "ObjDllRelease\prepared_statement.obj"  "ObjDllRelease\ 
result.obj"  "ObjDllRelease\robusttransaction.obj"  "ObjDllRelease\statement_par 
ameters.obj"  "ObjDllRelease\strconv.obj"  "ObjDllRelease\subtransaction.obj"  " 
ObjDllRelease\tablereader.obj"  "ObjDllRelease\tablestream.obj"  "ObjDllRelease\ 
tablewriter.obj"  "ObjDllRelease\transaction.obj"  "ObjDllRelease\transaction_ba 
se.obj"  "ObjDllRelease\tuple.obj"  "ObjDllRelease\util.obj"  "ObjDllRelease\lib 
pqxx.obj" /out:"lib\libpqxx.dll" /implib:"lib\libpqxx.lib" 
  Creating library lib\libpqxx.lib and object lib\libpqxx.exp 

[plain] view plaincopyprint?

link.exe kernel32.lib ws2_32.lib advapi32.lib /nologo /dll /machine:I386

shell32.lib secur32.lib wldap32.lib /libpath:"C:\hisql-x86-2.0.1"\lib libpq.lib

"ObjDllRelease\binarystring.obj"  "ObjDllRelease\connection.obj"  "ObjDllRelea

se\connection_base.obj"  "ObjDllRelease\cursor.obj"  "ObjDllRelease\dbtransactio

n.obj"  "ObjDllRelease\errorhandler.obj"  "ObjDllRelease\except.obj"  "ObjDllRel

ease\field.obj"  "ObjDllRelease\largeobject.obj"  "ObjDllRelease\nontransaction.

obj"  "ObjDllRelease\notification.obj"  "ObjDllRelease\notify-listen.obj"  "ObjD

llRelease\pipeline.obj"  "ObjDllRelease\prepared_statement.obj"  "ObjDllRelease\

result.obj"  "ObjDllRelease\robusttransaction.obj"  "ObjDllRelease\statement_par

ameters.obj"  "ObjDllRelease\strconv.obj"  "ObjDllRelease\subtransaction.obj"  "

ObjDllRelease\tablereader.obj"  "ObjDllRelease\tablestream.obj"  "ObjDllRelease\

tablewriter.obj"  "ObjDllRelease\transaction.obj"  "ObjDllRelease\transaction_ba

se.obj"  "ObjDllRelease\tuple.obj"  "ObjDllRelease\util.obj"  "ObjDllRelease\lib

pqxx.obj" /out:"lib\libpqxx.dll" /implib:"lib\libpqxx.lib"

Creating library lib\libpqxx.lib and object lib\libpqxx.exp

link.exe kernel32.lib ws2_32.lib advapi32.lib /nologo /dll /machine:I386

shell32.lib secur32.lib wldap32.lib /libpath:"C:\hisql-x86-2.0.1"\lib libpq.lib

"ObjDllRelease\binarystring.obj"  "ObjDllRelease\connection.obj"  "ObjDllRelea

se\connection_base.obj"  "ObjDllRelease\cursor.obj"  "ObjDllRelease\dbtransactio

n.obj"  "ObjDllRelease\errorhandler.obj"  "ObjDllRelease\except.obj"  "ObjDllRel

ease\field.obj"  "ObjDllRelease\largeobject.obj"  "ObjDllRelease\nontransaction.

obj"  "ObjDllRelease\notification.obj"  "ObjDllRelease\notify-listen.obj"  "ObjD

llRelease\pipeline.obj"  "ObjDllRelease\prepared_statement.obj"  "ObjDllRelease\

result.obj"  "ObjDllRelease\robusttransaction.obj"  "ObjDllRelease\statement_par

ameters.obj"  "ObjDllRelease\strconv.obj"  "ObjDllRelease\subtransaction.obj"  "

ObjDllRelease\tablereader.obj"  "ObjDllRelease\tablestream.obj"  "ObjDllRelease\

tablewriter.obj"  "ObjDllRelease\transaction.obj"  "ObjDllRelease\transaction_ba

se.obj"  "ObjDllRelease\tuple.obj"  "ObjDllRelease\util.obj"  "ObjDllRelease\lib

pqxx.obj" /out:"lib\libpqxx.dll" /implib:"lib\libpqxx.lib"

Creating library lib\libpqxx.lib and object lib\libpqxx.exp  最终会在lib目录下生成:

[plain] view plaincopyprint?

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0>dir/b/s lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpq.dll

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpq.lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.dll

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.dll.manifest

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.exp

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.dll

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.dll.manifest

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.exp

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.ilk

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.pdb

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx_static.lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx_staticD.lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\msdia80.dll

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0>dir/b/s lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpq.dll

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpq.lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.dll

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.dll.manifest

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.exp

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.dll

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.dll.manifest

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.exp

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.ilk

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.pdb

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx_static.lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx_staticD.lib

D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\msdia80.dll

下边来看看最简单的示例:

iihero=# create user foo password 'foo1';

CREATE ROLE

[sql] view plaincopyprint?

iihero=> create table t(id int primary key, col2 varchar(32));

注意:  CREATE TABLE / PRIMARY KEY 将要为表 "t" 创建隐含索引 "t_pkey"

CREATE TABLE

iihero=> \encoding

GBK

iihero=> insert into t values(1 ,'不同类型的列表');

INSERT 0 1

iihero=> select * from t;

id |      col2

----+----------------

1 | 不同类型的列表

(1 行记录)

iihero=> create table t(id int primary key, col2 varchar(32));

注意:  CREATE TABLE / PRIMARY KEY 将要为表 "t" 创建隐含索引 "t_pkey"

CREATE TABLE

iihero=> \encoding

GBK

iihero=> insert into t values(1 ,'不同类型的列表');

INSERT 0 1

iihero=> select * from t;

id |      col2

----+----------------

1 | 不同类型的列表

(1 行记录)

将编译出来后的include, lib目录提取到固定的目录,与你原来的postgresql的include和lib目录,可以合到一起。给开发使用。

下边是一个最简单的示例:

[cpp] view plaincopyprint?

#include <iostream></p>
<p>#include <pqxx/pqxx></p>
<p>int main()</p>
<p>{</p>
<p>pqxx::connection conn("dbname=iihero hostaddr=127.0.0.1 user=foo password=foo1" );</p>
<p>if(conn.is_open())</p>
<p>{</p>
<p>std::cout << "Connection succesful!" << std::endl;</p>
<p>std::cout << conn.options()<<std::endl;</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>std::cout << "Something went wrong... oops" << std::endl;</p>
<p>}</p>
<p>pqxx::work w(conn);</p>
<p>pqxx::result res = w.exec("SELECT 1");</p>
<p>w.commit();</p>
<p>std::cout << res[0][0].as<int>() << std::endl;</p>
<p>}</p>
<p>
ログイン後にコピー

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQLの役割:Webアプリケーションのデータベース MySQLの役割:Webアプリケーションのデータベース Apr 17, 2025 am 12:23 AM

WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

Innodb Redoログの役割を説明し、ログを元に戻します。 Innodb Redoログの役割を説明し、ログを元に戻します。 Apr 15, 2025 am 12:16 AM

INNODBは、レドログと非論的なものを使用して、データの一貫性と信頼性を確保しています。 1.レドログは、クラッシュの回復とトランザクションの持続性を確保するために、データページの変更を記録します。 2.Undologsは、元のデータ値を記録し、トランザクションロールバックとMVCCをサポートします。

MySQL対その他のプログラミング言語:比較 MySQL対その他のプログラミング言語:比較 Apr 19, 2025 am 12:22 AM

他のプログラミング言語と比較して、MySQLは主にデータの保存と管理に使用されますが、Python、Java、Cなどの他の言語は論理処理とアプリケーション開発に使用されます。 MySQLは、データ管理のニーズに適した高性能、スケーラビリティ、およびクロスプラットフォームサポートで知られていますが、他の言語は、データ分析、エンタープライズアプリケーション、システムプログラミングなどのそれぞれの分野で利点があります。

MySQL Index Cardinalityはクエリパフォーマンスにどのように影響しますか? MySQL Index Cardinalityはクエリパフォーマンスにどのように影響しますか? Apr 14, 2025 am 12:18 AM

MySQLインデックスのカーディナリティは、クエリパフォーマンスに大きな影響を及ぼします。1。高いカーディナリティインデックスは、データ範囲をより効果的に狭め、クエリ効率を向上させることができます。 2。低カーディナリティインデックスは、完全なテーブルスキャンにつながり、クエリのパフォーマンスを削減する可能性があります。 3。ジョイントインデックスでは、クエリを最適化するために、高いカーディナリティシーケンスを前に配置する必要があります。

初心者向けのMySQL:データベース管理を開始します 初心者向けのMySQL:データベース管理を開始します Apr 18, 2025 am 12:10 AM

MySQLの基本操作には、データベース、テーブルの作成、およびSQLを使用してデータのCRUD操作を実行することが含まれます。 1.データベースの作成:createdatabasemy_first_db; 2。テーブルの作成:createTableBooks(idintauto_incrementprimarykey、titlevarchary(100)notnull、authorvarchar(100)notnull、published_yearint); 3.データの挿入:InsertIntoBooks(タイトル、著者、公開_year)VA

MySQL対その他のデータベース:オプションの比較 MySQL対その他のデータベース:オプションの比較 Apr 15, 2025 am 12:08 AM

MySQLは、Webアプリケーションやコンテンツ管理システムに適しており、オープンソース、高性能、使いやすさに人気があります。 1)PostgreSQLと比較して、MySQLは簡単なクエリと高い同時読み取り操作でパフォーマンスが向上します。 2)Oracleと比較して、MySQLは、オープンソースと低コストのため、中小企業の間でより一般的です。 3)Microsoft SQL Serverと比較して、MySQLはクロスプラットフォームアプリケーションにより適しています。 4)MongoDBとは異なり、MySQLは構造化されたデータおよびトランザクション処理により適しています。

MySQL:構造化データとリレーショナルデータベース MySQL:構造化データとリレーショナルデータベース Apr 18, 2025 am 12:22 AM

MySQLは、テーブル構造とSQLクエリを介して構造化されたデータを効率的に管理し、外部キーを介してテーブル間関係を実装します。 1.テーブルを作成するときにデータ形式と入力を定義します。 2。外部キーを使用して、テーブル間の関係を確立します。 3。インデックス作成とクエリの最適化により、パフォーマンスを改善します。 4.データベースを定期的にバックアップおよび監視して、データのセキュリティとパフォーマンスの最適化を確保します。

InnoDBバッファープールとそのパフォーマンスの重要性を説明してください。 InnoDBバッファープールとそのパフォーマンスの重要性を説明してください。 Apr 19, 2025 am 12:24 AM

Innodbbufferpoolは、データをキャッシュしてページをインデックス作成することにより、ディスクI/Oを削減し、データベースのパフォーマンスを改善します。その作業原則には次のものが含まれます。1。データ読み取り:Bufferpoolのデータを読む。 2。データの書き込み:データを変更した後、bufferpoolに書き込み、定期的にディスクに更新します。 3.キャッシュ管理:LRUアルゴリズムを使用して、キャッシュページを管理します。 4.読みメカニズム:隣接するデータページを事前にロードします。 BufferPoolのサイジングと複数のインスタンスを使用することにより、データベースのパフォーマンスを最適化できます。

See all articles