Saya sentiasa ingin tahu tentang bahasa pengaturcaraan baharu dan rangka kerjanya. Selama ini pengalaman dan rasa ingin tahu saya tersebar hanya dalam pembangunan bahagian hadapan (saya telah melakukan beberapa bahagian belakang sekalipun?). Saya mencabar diri saya untuk mengembangkan kemahiran saya dan saya menemui bahasa pengaturcaraan D. D dalam perkataan mudah ialah versi lanjutan C dan CPP.
Apakah itu D? tapak web menyatakan “**D adalah bahasa pengaturcaraan tujuan umum dengan penaipan statik, akses peringkat sistem dan sintaks seperti C. Dengan Bahasa Pengaturcaraan D, tulis dengan pantas, baca dengan pantas dan lari dengan pantas.”
Saya telah menggunakan PostgreSQL sebagai pangkalan data saya untuk kerja saya, dan itulah sebabnya saya memilihnya untuk perpustakaan ini juga. PostgreSQL ialah salah satu sistem pangkalan data SQL sumber terbuka utama yang digunakan oleh syarikat sekarang dan ciri-cirinya semakin berkembang.
Apabila bermain-main dengan bahasa D saya tidak dapat mencari satu pakej yang memuaskan hati saya, sama ada pakej dihentikan penyelenggaraan atau boleh digunakan sebagai pertanyaan terus. Dari latar belakang JavaScript saya menggunakan Sequalize ORM. Itu memberi saya idea, Bagaimana pula dengan yang serupa dalam D.
Jadi, saya melakukan penyelidikan dan saya dapati Postgres menyediakan perpustakaan untuk C. Kemudian saya fikir, bagaimana pula dengan menggunakan pengikatan C dalam D dan menggunakannya untuk membangunkan ORM. Saya menemui kod sumber daripada https://github.com/adamdruppe/arsd/blob/master/postgres.d untuk mengikat perpustakaan C kepada D.
Keperluan:
Untuk mencipta projek baharu, gunakan arahan berikut dalam terminal anda:
dub init <project_name>
Arahan ini akan mencipta direktori projek baharu dengan nama yang ditentukan dan menyediakan struktur asas untuk projek D.
Dengan langkah-langkah ini selesai, anda akan menyediakan struktur projek D asas dan sedia untuk pembangunan.
Dalam Windows bahagian di bawah perlu ditambah pada dub.json.
dub init <project_name>
atau
Cara yang saya lakukan ialah menyalin semua fail DLL yang diperlukan ke folder lib (dicipta secara manual) dan kemudian menambah kod di bawah:
"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" ],
Dalam Linux atau macOS, anda perlu memastikan bahawa perpustakaan pembangunan PostgreSQL dipasang dan dipautkan dengan betul. Anda biasanya boleh melakukan ini dengan memasang pakej yang sesuai melalui pengurus pakej sistem anda. Contohnya, pada sistem berasaskan Ubuntu atau Debian, anda mungkin menggunakan:
"copyFiles-windows": [ "libs/*.dll" ], "lflags-windows": [ "/LIBPATH:$PACKAGE_DIR/libs" ], "libs": [ "pq" ]
Setelah anda memasang perpustakaan yang diperlukan dan dipautkan dengan betul, anda boleh meneruskan dengan menyediakan projek D anda untuk berfungsi dengan PostgreSQL.
Berikut ialah pengikatan C untuk D.
sudo apt-get install libpq-dev
Kini kita boleh menggunakan fungsi ini dengan mudah dalam D.
Ini ialah kod untuk beberapa pengendalian pengecualian asas:
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); }
Saya akan menambah lebih banyak pengecualian dan situasi lain semasa saya mengusahakan projek ini
Sekarang buat cipta fail pelaksanaan/teras/teras.d untuk menulis kod sambungan.
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); } }
Isi utama kod di atas:
Pelaksanaan ini menyediakan antara muka peringkat tinggi untuk aplikasi D untuk berinteraksi dengan pangkalan data PostgreSQL, menghilangkan banyak butiran peringkat rendah C API.
Anda mungkin mempunyai amaran/ralat IDE sekarang bahawa "modul sambungan tidak ditemui"
Mari buat modul sambungan:
Buat fail _internal/connection.d tambah kod ini:
dub init <project_name>
Tambah pemalar dan pilihan lain untuk SQL:
_dalaman/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 menyokong metaprogramming templat, ciri yang membolehkan anda menulis kod yang sangat generik. Ini bermakna D mempunyai templat serupa dengan templat dalam C tetapi lebih berkuasa dan fleksibel.
Templat ABC dalam D | Blog D
Sekarang mari buat kelas templat.
model.d
Sekarang gunakan kod daripada https://github.com/rodevasia/sequelized/blob/main/source/postgres/model.d tampal pada fail anda
Mari kita periksa kod daripada pautan GitHub yang disediakan:
"copyFiles-windows": [ "libs/*.dll" ], "lflags-windows": [ "/LIBPATH:$PACKAGE_DIR/libs" ], "libs": [ "pq" ]
Kod ini mentakrifkan Model kelas templat dalam D. Berikut ialah pecahan komponen utamanya:
Kami menulis semua kod untuk berfungsi. Mari jadikan ini sebagai perpustakaan. tambahkan ini pada dub.json
anda
dub init <project_name>
Biar buat projek baharu:
"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" ],
tambah pustaka sebagai kebergantungan dalam dub.json
"copyFiles-windows": [ "libs/*.dll" ], "lflags-windows": [ "/LIBPATH:$PACKAGE_DIR/libs" ], "libs": [ "pq" ]
app.d
sudo apt-get install libpq-dev
Mari pecahkan kod dan terangkan komponen utamanya:
Kod mengimport modul yang diperlukan daripada perpustakaan standard dan perpustakaan Sequalized:
Fungsi utama menunjukkan cara menggunakan perpustakaan Sequalized:
Kelas ini mentakrifkan model untuk jadual pangkalan data:
Saya belum memasukkan proses penuh, dan itu adalah untuk anda ketahui :)
Jika anda ingin menyumbang kepada projek saya di sini ialah pautan untuk repo:
https://github.com/rodevasia/sequelized
Atas ialah kandungan terperinci Membina Perpustakaan PostgreSQL dalam D. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!