国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 后端開發(fā) C++ 用 D 構(gòu)建 PostgreSQL 庫

用 D 構(gòu)建 PostgreSQL 庫

Oct 24, 2024 am 06:16 AM

Building a PostgreSQL Library in D

我總是對新的編程語言及其框架感到好奇。一直以來,我的經(jīng)驗(yàn)和好奇心都只集中在前端開發(fā)上(不過我也做過一些后端開發(fā)?)。我挑戰(zhàn)自己以擴(kuò)展我的技能,并找到了 D 編程語言。 D簡單來說就是C和CPP的高級版本。

D是什么?該網(wǎng)站稱“**D?是一種通用編程語言,具有靜態(tài)類型、系統(tǒng)級訪問和類似 C 的語法。使用D 編程語言,快速寫入、快速讀取和快速運(yùn)行。

我使用 PostgreSQL 作為我作品的數(shù)據(jù)庫,這也是我為這個(gè)庫選擇它的原因。 PostgreSQL 是公司現(xiàn)在使用的主要開源 SQL 數(shù)據(jù)庫系統(tǒng)之一,其功能正在不斷擴(kuò)展。

為什么要構(gòu)建自定義 ORM 庫?

在搞D語言的時(shí)候找不到一個(gè)能滿足我需求的包,要么是停止維護(hù)了,要么是可以直接查詢。我有 JavaScript 背景,使用 Sequalize ORM。這讓我想到了一個(gè)主意,D 中類似的怎么樣。

所以,我做了一些研究,發(fā)現(xiàn) Postgres 為 C 提供了庫。然后我想,如何在 D 中使用 C 綁定并使用它來開發(fā) ORM。 我從 https://github.com/adamdruppe/arsd/blob/master/postgres.d 找到了用于將 C 庫綁定到 D 的源代碼。

入門

要求:

  • 您的系統(tǒng)中必須安裝 PostgreSQL。 ( 我為 PostgreSQL 16 開發(fā))
  • IDE(Zed/ VSCode/Vim)
  • DMD - d 語言編譯器

要?jiǎng)?chuàng)建新項(xiàng)目,請?jiān)诮K端中使用以下命令:

  1. 打開終端或命令提示符。
  2. 導(dǎo)航到您要?jiǎng)?chuàng)建項(xiàng)目的目錄。
  3. 運(yùn)行命令:
dub init <project_name>

此命令將創(chuàng)建一個(gè)具有指定名稱的新項(xiàng)目目錄,并設(shè)置 D 項(xiàng)目的基本結(jié)構(gòu)。

  1. 系統(tǒng)將提示您輸入以下信息:
    • 格式 - .sdl 或 .json(我選擇了 json )
    • 項(xiàng)目描述(可選)
    • 作者姓名
    • 許可證(例如 MIT、BSD 等)
    • 版權(quán)字符串
    • 添加依賴項(xiàng)(可選)
  2. 提供信息后,dub 將以您的項(xiàng)目名稱創(chuàng)建一個(gè)新目錄并生成以下文件:
    • dub.json:項(xiàng)目的配置文件
    • source/app.d:主要源文件
    • .gitignore:Git 忽略文件
  3. 導(dǎo)航到新項(xiàng)目目錄:cd ;
  4. 您現(xiàn)在可以開始開發(fā)您的 D 項(xiàng)目了!

完成這些步驟后,您將建立一個(gè)基本的 D 項(xiàng)目結(jié)構(gòu)并準(zhǔn)備好進(jìn)行開發(fā)。

在 Windows 中,需要將以下部分添加到 dub.json。

dub init <project_name>

我的方法是將所有必需的 DLL 文件復(fù)制到 lib(手動(dòng)創(chuàng)建)文件夾,然后添加以下代碼:

"libs": [ "pq" ],
    "lflags-windows-x86_64": [ "-LIBPATH:C:/Program Files/PostgreSQL/16/lib/" ],
    "copyFiles-windows-x86_64": [
        "C:/Program Files/PostgreSQL/16/lib/libpq.dll",
        "C:/Program Files/PostgreSQL/16/bin/libintl-9.dll",
        "C:/Program Files/PostgreSQL/16/bin/libssl-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libcrypto-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libwinpthread-1.dll",
        "C:/Program Files/PostgreSQL/16/bin/libiconv-2.dll"
    ],

在 Linux 或 macOS 中,您需要確保 PostgreSQL 開發(fā)庫已安裝并正確鏈接。通常,您可以通過系統(tǒng)的包管理器安裝適當(dāng)?shù)陌鼇硗瓿纱瞬僮鳌@?,在基?Ubuntu 或 Debian 的系統(tǒng)上,您可以使用:

"copyFiles-windows": [
        "libs/*.dll"
    ],
    "lflags-windows": [
        "/LIBPATH:$PACKAGE_DIR/libs"
    ],
    "libs": [
        "pq"
    ]

安裝并正確鏈接必要的庫后,您可以繼續(xù)設(shè)置 D 項(xiàng)目以使用 PostgreSQL。

實(shí)現(xiàn) C 綁定:

這是 D 的 C 綁定。

sudo apt-get install libpq-dev

現(xiàn)在我們可以在D中輕松使用這些函數(shù)了。
這是一些基本異常處理的代碼:

module postgres.implementation.implementationc;

extern (C)
{
    struct PGconn
    {
    }

    struct PGresult
    {
    }

    void PQfinish(PGconn*);

    PGconn* PQconnectdb(const char*);

    int PQstatus(PGconn*); // FIXME check return value

    const(char*) PQerrorMessage(PGconn*);

    char* PQresultVerboseErrorMessage(const PGresult* res,
        PGVerbosity verbosity,
        PGContextVisibility show_context);
    PGresult* PQexec(PGconn*, const char*);
    void PQclear(PGresult*);

    PGresult* PQprepare(PGconn*, const char* stmtName, const char* query,
        ulong nParams, const void* paramTypes);

    PGresult* PQexecPrepared(PGconn*, const char* stmtName,
        int nParams, const char** paramValues,
        const int* paramLengths, const int* paramFormats, int resultFormat);

    int PQresultStatus(PGresult*); // FIXME check return value

    int PQnfields(PGresult*); // number of fields in a result
    const(char*) PQfname(PGresult*, int); // name of field

    int PQntuples(PGresult*); // number of rows in result
    const(char*) PQgetvalue(PGresult*, int row, int column);

    size_t PQescapeString(char* to, const char* from, size_t length);

    enum int CONNECTION_OK = 0;
    enum int PGRES_COMMAND_OK = 1;
    enum int PGRES_TUPLES_OK = 2;
    enum int PGRES_FATAL_ERROR = 7;
    enum PGContextVisibility
    {
        PQSHOW_CONTEXT_NEVER,
        PQSHOW_CONTEXT_ERRORS,
        PQSHOW_CONTEXT_ALWAYS
    }

    enum PGVerbosity
    {
        PQERRORS_TERSE,
        PQERRORS_DEFAULT,
        PQERRORS_VERBOSE,
        PQERRORS_SQLSTATE
    }

    int PQgetlength(const PGresult* res,
        int row_number,
        int column_number);
    int PQgetisnull(const PGresult* res,
        int row_number,
        int column_number);

    int PQfformat(const PGresult* res, int column_number);

    alias Oid = int;
    enum BYTEAOID = 17;
    Oid PQftype(const PGresult* res, int column_number);

    char* PQescapeByteaConn(PGconn* conn,
        const ubyte* from,
        size_t from_length,
        size_t* to_length);
    char* PQunescapeBytea(const char* from, size_t* to_length);
    void PQfreemem(void* ptr);

    char* PQcmdTuples(PGresult* res);

}

  • PGSqlException: 繼承自標(biāo)準(zhǔn) D Exception 類的自定義異常類。它旨在處理 PostgreSQL 特定的錯(cuò)誤。
  • 字段:
    • code:存儲(chǔ)錯(cuò)誤代碼
    • sqlState:存儲(chǔ) SQL 狀態(tài)
    • message:存儲(chǔ)錯(cuò)誤消息
  • 構(gòu)造函數(shù): 采用 PGconn* (PostgreSQL 連接)和可選的 PGresult* (查詢結(jié)果)。 PQresultVerboseErrorMessage 和 PQerrorMessage 用于提取詳細(xì)的錯(cuò)誤信息。
  • DuplicateKeyException: 一個(gè)用于處理重復(fù)鍵錯(cuò)誤的簡單異常類。它只接受一個(gè)消息參數(shù)并將其傳遞給 Exception 基類。

當(dāng)我從事這個(gè)項(xiàng)目時(shí),我將添加更多例外和其他情況

現(xiàn)在創(chuàng)建一個(gè)implementation/core/core.d 文件用于編寫連接代碼。

module postgres.implementation.exception;

public:
import std.conv;

private import postgres.implementation.implementationc;

class PGSqlException : Exception
{
    string code;
    string sqlState;
    string message;
    this(PGconn* conn, PGresult* res = null)
    {
        if (res != null)
        {
            char* c = PQresultVerboseErrorMessage(res, PGVerbosity.PQERRORS_VERBOSE, PGContextVisibility
                    .PQSHOW_CONTEXT_ALWAYS);
            char* s = PQresultVerboseErrorMessage(res, PGVerbosity.PQERRORS_SQLSTATE, PGContextVisibility
                    .PQSHOW_CONTEXT_ALWAYS);
           string ss = to!string(c);
           import std.string:split;
           this.code = to!string(ss.split(':')[1]);

            this.sqlState = to!string(s);
        }
        const char* m = PQerrorMessage(conn);

        this.message = to!string(m);
        super(this.message);
    }
}

class DuplicateKeyException : Exception
{
    this(string message)
    {
        super(message);
    }
}

上述代碼要點(diǎn):

  • Postgres 類: 表示 PostgreSQL 數(shù)據(jù)庫連接。
    • 管理連接創(chuàng)建、查詢和準(zhǔn)備語句執(zhí)行。
    • 使用之前定義的 C 綁定與 PostgreSQL 庫交互。
  • QueryResult 類: 封裝數(shù)據(jù)庫查詢的結(jié)果。
    • 以結(jié)構(gòu)化格式存儲(chǔ)查詢結(jié)果。
    • 處理 PostgreSQL 返回的不同數(shù)據(jù)類型和格式。
  • 錯(cuò)誤處理: 實(shí)現(xiàn) PostgreSQL 錯(cuò)誤的自定義異常處理。
  • 連接管理:包括連接丟失時(shí)的自動(dòng)重新連接嘗試。
  • 準(zhǔn)備好的語句:支持執(zhí)行帶有參數(shù)綁定的準(zhǔn)備好的SQL語句。
  • 內(nèi)存管理:使用析構(gòu)函數(shù)(~this())正確釋放資源。
  • UTF-8 支持: 默認(rèn)將連接編碼設(shè)置為 UTF-8。

此實(shí)現(xiàn)為 D 應(yīng)用程序提供了與 PostgreSQL 數(shù)據(jù)庫交互的高級接口,抽象了 C API 的許多低級細(xì)節(jié)。

現(xiàn)在您可能會(huì)收到 IDE 警告/錯(cuò)誤“未找到連接模塊

讓我們創(chuàng)建連接模塊:

創(chuàng)建 _internal/connection.d 文件添加以下代碼:

dub init <project_name>

為 SQL 添加常量和其他選項(xiàng):

_internal/consts.d

"libs": [ "pq" ],
    "lflags-windows-x86_64": [ "-LIBPATH:C:/Program Files/PostgreSQL/16/lib/" ],
    "copyFiles-windows-x86_64": [
        "C:/Program Files/PostgreSQL/16/lib/libpq.dll",
        "C:/Program Files/PostgreSQL/16/bin/libintl-9.dll",
        "C:/Program Files/PostgreSQL/16/bin/libssl-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libcrypto-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libwinpthread-1.dll",
        "C:/Program Files/PostgreSQL/16/bin/libiconv-2.dll"
    ],

創(chuàng)建模型模板

D 支持模板元編程,該功能允許您編寫高度通用的代碼。這意味著 D 的模板與 C 中的相似,但更強(qiáng)大、更靈活。
D 中模板的 ABC | D 博客

D 模板的主要特點(diǎn):

  1. 編譯時(shí)類型檢查:模板在編譯時(shí)進(jìn)行檢查,確保類型安全。
  2. 代碼生成:您可以使用模板為不同類型或值生成專門的代碼。
  3. 可變參數(shù)模板: D 支持可以采用任意數(shù)量參數(shù)的模板,包括類型和值。
  4. 靜態(tài) if 和 mixin: 這些允許您在編譯期間根據(jù)條件生成和操作代碼,甚至注入基于字符串的代碼(使用 mixin)。

現(xiàn)在讓我們創(chuàng)建一個(gè)模板類。

模型.d

現(xiàn)在使用 https://github.com/rodevasia/sequelized/blob/main/source/postgres/model.d 中的代碼粘貼到您的文件

讓我們檢查一下所提供的 GitHub 鏈接中的代碼:

"copyFiles-windows": [
        "libs/*.dll"
    ],
    "lflags-windows": [
        "/LIBPATH:$PACKAGE_DIR/libs"
    ],
    "libs": [
        "pq"
    ]

此代碼在 D 中定義了一個(gè)模板類 Model。以下是其關(guān)鍵組件的細(xì)分:

  1. 模塊聲明:代碼是postgres.model模塊的一部分。
  2. 導(dǎo)入:導(dǎo)入各種標(biāo)準(zhǔn) D 庫和自定義模塊以在類中使用。
  3. 模板類: Model 類被定義為帶有類型參數(shù) T 的模板。這允許該類使用不同的類型。
  4. 類方法: 該類包含幾個(gè)用于數(shù)據(jù)庫操作的方法,例如 save()、update()、delete() 和 find()。
  5. 編譯時(shí)反射:代碼使用 D 的編譯時(shí)功能來檢查 T 類型的字段并生成適當(dāng)?shù)?SQL 查詢。
  6. SQL 查詢生成: getInsertQuery() 和 getUpdateQuery() 等方法根據(jù)類型 T 的結(jié)構(gòu)動(dòng)態(tài)創(chuàng)建 SQL 查詢。
  7. 數(shù)據(jù)庫交互: 該類使用 Connection 對象與 PostgreSQL 數(shù)據(jù)庫交互。

我們編寫了所有工作代碼。讓我們把它變成一個(gè)圖書館。將其添加到您的 dub.json

dub init <project_name>

使用圖書館:

讓我們創(chuàng)建一個(gè)新項(xiàng)目:

"libs": [ "pq" ],
    "lflags-windows-x86_64": [ "-LIBPATH:C:/Program Files/PostgreSQL/16/lib/" ],
    "copyFiles-windows-x86_64": [
        "C:/Program Files/PostgreSQL/16/lib/libpq.dll",
        "C:/Program Files/PostgreSQL/16/bin/libintl-9.dll",
        "C:/Program Files/PostgreSQL/16/bin/libssl-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libcrypto-3-x64.dll",
        "C:/Program Files/PostgreSQL/16/bin/libwinpthread-1.dll",
        "C:/Program Files/PostgreSQL/16/bin/libiconv-2.dll"
    ],

將庫添加為 dub.json 中的依賴項(xiàng)

"copyFiles-windows": [
        "libs/*.dll"
    ],
    "lflags-windows": [
        "/LIBPATH:$PACKAGE_DIR/libs"
    ],
    "libs": [
        "pq"
    ]

app.d

sudo apt-get install libpq-dev

讓我們分解代碼并解釋其主要組件:

進(jìn)口

代碼從標(biāo)準(zhǔn)庫和Sequalized庫導(dǎo)入必要的模塊:

  • std.stdio:用于基本輸入/輸出操作
  • postgres._internal.connection:處理數(shù)據(jù)庫連接詳細(xì)信息
  • postgres.implementation.core:PostgreSQL 操作的核心功能
  • postgres.model:提供用于定義數(shù)據(jù)庫模型的模型混合
  • postgres._internal.consts:包含庫中使用的常量值

主要功能

main函數(shù)演示了如何使用Sequalized庫:

  • 它創(chuàng)建一個(gè)包含連接詳細(xì)信息的 DatabaseConnectionOption 對象
  • 使用這些選項(xiàng)初始化 Postgres 對象
  • 創(chuàng)建Example類的實(shí)例
  • 調(diào)用sync()在數(shù)據(jù)庫中創(chuàng)建對應(yīng)的表
  • 設(shè)置文本字段的值并將記錄插入數(shù)據(jù)庫

示例類

此類定義數(shù)據(jù)庫表的模型:

  • 它使用 Model mixin 來繼承 ORM 功能
  • 定義兩個(gè)字段:id 和 textField
  • 使用 @Type、@PmKey 和 @unique 等屬性來指定字段屬性

我沒有包含完整的過程,供你了解:)

如果您愿意為我的項(xiàng)目做出貢獻(xiàn),這里是存儲(chǔ)庫的鏈接:
https://github.com/rodevasia/sequelized

以上是用 D 構(gòu)建 PostgreSQL 庫的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

c多態(tài)性:功能是否超載一種多態(tài)性? c多態(tài)性:功能是否超載一種多態(tài)性? Jun 20, 2025 am 12:05 AM

是的,函數(shù)重載是C 中的一種多態(tài)形式,具體來說是編譯時(shí)多態(tài)。1.函數(shù)重載允許使用相同名稱但不同參數(shù)列表的多個(gè)函數(shù)。2.編譯器根據(jù)提供的參數(shù)在編譯時(shí)決定調(diào)用哪個(gè)函數(shù)。3.與運(yùn)行時(shí)多態(tài)不同,函數(shù)重載在運(yùn)行時(shí)沒有額外開銷,實(shí)現(xiàn)簡單,但靈活性較低。

C中有哪種多態(tài)性的多態(tài)性?解釋了 C中有哪種多態(tài)性的多態(tài)性?解釋了 Jun 20, 2025 am 12:08 AM

C 有兩種主要的多態(tài)類型:編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。1.編譯時(shí)多態(tài)通過函數(shù)重載和模板實(shí)現(xiàn),提供高效但可能導(dǎo)致代碼膨脹。2.運(yùn)行時(shí)多態(tài)通過虛函數(shù)和繼承實(shí)現(xiàn),提供靈活性但有性能開銷。

C:多態(tài)性真的有用嗎? C:多態(tài)性真的有用嗎? Jun 20, 2025 am 12:01 AM

是的,C 中的多態(tài)性非常有用。 1)它提供了靈活性,允許輕松添加新類型;2)促進(jìn)代碼重用,減少重復(fù);3)簡化維護(hù),使代碼更易擴(kuò)展和適應(yīng)變化。盡管存在性能和內(nèi)存管理的挑戰(zhàn),但其優(yōu)勢在復(fù)雜系統(tǒng)中尤為顯著。

C驅(qū)動(dòng)器:常見錯(cuò)誤 C驅(qū)動(dòng)器:常見錯(cuò)誤 Jun 20, 2025 am 12:12 AM

C destructorscanleadtoseveralcommonerrors.Toavoidthem:1)Preventdoubledeletionbysettingpointerstonullptrorusingsmartpointers.2)Handleexceptionsindestructorsbycatchingandloggingthem.3)Usevirtualdestructorsinbaseclassesforproperpolymorphicdestruction.4

c認(rèn)識(shí)python的人的教程 c認(rèn)識(shí)python的人的教程 Jul 01, 2025 am 01:11 AM

學(xué)Python的人轉(zhuǎn)學(xué)C 最直接的困惑是:為什么不能像Python那樣寫?因?yàn)镃 雖然語法更復(fù)雜,但提供了底層控制能力和性能優(yōu)勢。1.語法結(jié)構(gòu)上,C 使用花括號(hào){}而非縮進(jìn)組織代碼塊,且變量類型必須顯式聲明;2.類型系統(tǒng)與內(nèi)存管理方面,C 沒有自動(dòng)垃圾回收機(jī)制,需手動(dòng)管理內(nèi)存并注意釋放資源,使用RAII技術(shù)可輔助資源管理;3.函數(shù)與類定義中,C 需要明確訪問修飾符、構(gòu)造函數(shù)和析構(gòu)函數(shù),并支持如運(yùn)算符重載等高級功能;4.標(biāo)準(zhǔn)庫方面,STL提供了強(qiáng)大的容器和算法,但需要適應(yīng)泛型編程思想;5

C中的多態(tài)性:綜合指南 C中的多態(tài)性:綜合指南 Jun 21, 2025 am 12:11 AM

C 中的多態(tài)性分為運(yùn)行時(shí)多態(tài)性和編譯時(shí)多態(tài)性。1.運(yùn)行時(shí)多態(tài)性通過虛函數(shù)實(shí)現(xiàn),允許在運(yùn)行時(shí)動(dòng)態(tài)調(diào)用正確的方法。2.編譯時(shí)多態(tài)性通過函數(shù)重載和模板實(shí)現(xiàn),提供更高的性能和靈活性。

C中的多態(tài)性的各種形式是什么? C中的多態(tài)性的各種形式是什么? Jun 20, 2025 am 12:21 AM

C polymorphismincludescompile-time,runtime,andtemplatepolymorphism.1)Compile-timepolymorphismusesfunctionandoperatoroverloadingforefficiency.2)Runtimepolymorphismemploysvirtualfunctionsforflexibility.3)Templatepolymorphismenablesgenericprogrammingfo

C多態(tài)性:編碼樣式 C多態(tài)性:編碼樣式 Jun 19, 2025 am 12:25 AM

C polymorphismisuniqueduetoitscombinationofcompile-timeandruntimepolymorphism,allowingforbothefficiencyandflexibility.Toharnessitspowerstylishly:1)Usesmartpointerslikestd::unique_ptrformemorymanagement,2)Ensurebaseclasseshavevirtualdestructors,3)Emp

See all articles