私は常に新しいプログラミング言語とそのフレームワークに興味がありました。これまでずっと、私の経験と好奇心はフロントエンド開発のみに広がっていました (バックエンドもいくつかやったことがありますが?)。自分のスキルを拡張することに挑戦し、D プログラミング言語に出会いました。 D は、簡単に言うと C と CPP の上級バージョンです。
Dとは何ですか?ウェブサイトには「**D は、静的型付け、システムレベルのアクセス、および C に似た構文を備えた汎用プログラミング言語です。 D プログラミング言語 を使用すると、高速に書き込み、高速に読み取り、高速に実行できます。」
私は作品のデータベースとして PostgreSQL を使用しており、それがこのライブラリにも PostgreSQL を選択した理由です。 PostgreSQL は、現在企業が使用している主要なオープンソース SQL データベース システムの 1 つであり、その機能はさらに拡張されています。
D 言語をいじっているときに、満足のいくパッケージが 1 つも見つかりませんでした。パッケージはメンテナンスが停止されているか、直接クエリとして使用できるかのどちらかです。 JavaScript のバックグラウンドから、Sequalize ORM を使用しました。それは私にアイデアを与えます。D で同様のものはどうでしょうか。
そこで、少し調べてみたところ、Postgres が C 用のライブラリを提供していることがわかりました。そこで、C のバインディングを D で使用して、ORM の開発に使用してはどうだろうと考えました。 C ライブラリを D にバインドするためのソース コードを https://github.com/adamdruppe/arsd/blob/master/postgres.d から見つけました。
要件:
新しいプロジェクトを作成するには、ターミナルで次のコマンドを使用します:
dub init <project_name>
このコマンドは、指定された名前で新しいプロジェクト ディレクトリを作成し、D プロジェクトの基本構造をセットアップします。
これらの手順を完了すると、基本的な D プロジェクト構造がセットアップされ、開発の準備が整います。
Windows では、以下のセクションを dub.json に追加する必要があります。
dub init <project_name>
または
私が行った方法は、必要なすべての DLL ファイルを lib (手動で作成した) フォルダーにコピーし、以下のコードを追加しました。
"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 開発ライブラリがインストールされ、適切にリンクされていることを確認する必要があります。通常、これを行うには、システムのパッケージ マネージャーを通じて適切なパッケージをインストールします。たとえば、Ubuntu または Debian ベースのシステムでは、次のように使用できます。
"copyFiles-windows": [ "libs/*.dll" ], "lflags-windows": [ "/LIBPATH:$PACKAGE_DIR/libs" ], "libs": [ "pq" ]
必要なライブラリをインストールして適切にリンクしたら、PostgreSQL で動作するように D プロジェクトのセットアップに進むことができます。
D の C バインディングは次のとおりです。
sudo apt-get install libpq-dev
これで、D でこれらの関数を簡単に使用できるようになりました。
これは、基本的な例外処理のコードです:
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); }
このプロジェクトに取り組みながら、例外やその他の状況をさらに追加していきます
次に、接続コードを記述するための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); } }
上記のコードの重要なポイント:
この実装は、D アプリケーションが PostgreSQL データベースと対話するための高レベルのインターフェイスを提供し、C API の低レベルの詳細の多くを抽象化します。
「接続モジュールが見つかりません」という IDE 警告/エラーが表示される可能性があります
接続モジュールを作成しましょう:
_internal/connection.d ファイルを作成し、次のコードを追加します:
dub init <project_name>
SQL の定数とその他のオプションを追加します:
_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" ],
D は、非常に汎用的なコードを作成できる機能である テンプレート メタプログラミング をサポートしています。これは、D には C のものと似た テンプレート があることを意味しますが、より強力で柔軟です。
D のテンプレートの ABC | D ブログ
次に、テンプレート クラスを作成しましょう。
モデル.d
次に、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 でテンプレート クラス Model を定義します。その主要なコンポーネントの内訳は次のとおりです。
動作するためのコードはすべて私たちが書きました。ここを図書館にしましょう。これを dub.json に追加します
dub init <project_name>
新しいプロジェクトを作成しましょう:
"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 にライブラリを依存関係として追加します
"copyFiles-windows": [ "libs/*.dll" ], "lflags-windows": [ "/LIBPATH:$PACKAGE_DIR/libs" ], "libs": [ "pq" ]
アプリd
sudo apt-get install libpq-dev
コードを分解して、その主要コンポーネントを説明しましょう:
コードは、標準ライブラリと Sequalized ライブラリから必要なモジュールをインポートします。
メイン関数は、Sequalized ライブラリの使用方法を示します。
このクラスはデータベース テーブルのモデルを定義します:
完全なプロセスは含めていません。それはあなたが調べてください:)
私のプロジェクトに貢献したい場合は、ここにリポジトリへのリンクがあります:
https://github.com/rodevasia/sequelized
以上がD での PostgreSQL ライブラリの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。