J'ai toujours été curieux de connaître les nouveaux langages de programmation et leurs frameworks. Pendant tout ce temps, mon expérience et ma curiosité se sont concentrées uniquement sur le développement front-end (mais j'ai fait du backend ?). Je me suis mis au défi d'élargir mes compétences et j'ai découvert le langage de programmation D. D est en termes simples la version avancée de C et CPP.
Qu'est-ce que D ? le site Web indique « **D est un langage de programmation à usage général avec un typage statique, un accès au niveau système et une syntaxe de type C. Avec le Langage de programmation D, écrivez vite, lisez vite et exécutez vite.”
J'ai utilisé PostgreSQL comme base de données pour mes travaux, et c'est pourquoi je l'ai également choisi pour cette bibliothèque. PostgreSQL est l'un des principaux systèmes de base de données SQL open source que les entreprises utilisent actuellement et ses fonctionnalités se développent encore plus.
En jouant avec le langage D, je n'ai pas trouvé un seul paquet qui me satisfasse, soit les paquets sont arrêtés en maintenance, soit ils peuvent être utilisés comme pour une requête directe. À partir d'un arrière-plan JavaScript, j'ai utilisé Sequalize ORM. Cela m'éclaire sur une idée, que diriez-vous d'une idée similaire en D.
Alors, j'ai fait quelques recherches et j'ai découvert que Postgres fournissait une bibliothèque pour C. Ensuite, j'ai pensé, que diriez-vous d'utiliser les liaisons C en D et de les utiliser pour développer l'ORM. J'ai trouvé le code source sur https://github.com/adamdruppe/arsd/blob/master/postgres.d pour lier la bibliothèque C à D.
Exigences :
Pour créer un nouveau projet, utilisez la commande suivante dans votre terminal :
dub init <project_name>
Cette commande créera un nouveau répertoire de projet avec le nom spécifié et mettra en place la structure de base d'un projet D.
Une fois ces étapes terminées, vous disposerez d'une structure de projet D de base configurée et prête à être développée.
Sous Windows, la section ci-dessous doit être ajoutée sur dub.json.
dub init <project_name>
ou
La façon dont je l'ai fait est de copier tous les fichiers DLL nécessaires dans le dossier lib (créé manuellement), puis d'ajouter le code ci-dessous :
"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" ],
Sous Linux ou macOS, vous devez vous assurer que les bibliothèques de développement PostgreSQL sont installées et correctement liées. Vous pouvez généralement le faire en installant les packages appropriés via le gestionnaire de packages de votre système. Par exemple, sur les systèmes basés sur Ubuntu ou Debian, vous pouvez utiliser :
"copyFiles-windows": [ "libs/*.dll" ], "lflags-windows": [ "/LIBPATH:$PACKAGE_DIR/libs" ], "libs": [ "pq" ]
Une fois que vous avez installé et correctement lié les bibliothèques nécessaires, vous pouvez procéder à la configuration de votre projet D pour qu'il fonctionne avec PostgreSQL.
Voici les liaisons C pour D.
sudo apt-get install libpq-dev
Maintenant, nous pouvons facilement utiliser ces fonctions dans D.
Voici le code pour une gestion de base des exceptions :
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); }
J'ajouterai d'autres exceptions et autres situations au fur et à mesure que je travaillerai sur ce projet
Créez maintenant un fichier Implementation/core/core.d pour écrire le code de connexion.
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); } }
Points clés du code ci-dessus :
Cette implémentation fournit une interface de haut niveau permettant aux applications D d'interagir avec les bases de données PostgreSQL, en éliminant de nombreux détails de bas niveau de l'API C.
Vous pourriez avoir un avertissement/erreur IDE maintenant que « module de connexion introuvable »
Créons un module de connexion :
Créez le fichier _internal/connection.d ajoutez ce code :
dub init <project_name>
Ajouter des constantes et d'autres options pour 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 prend en charge la métaprogrammation de modèles, une fonctionnalité qui vous permet d'écrire du code hautement générique. Cela signifie que D a des modèles similaires à ceux de C mais plus puissants et flexibles.
L’ABC des modèles en D | Le blog D
Créons maintenant une classe modèle.
modèle.d
Utilisez maintenant le code de https://github.com/rodevasia/sequelized/blob/main/source/postgres/model.d et collez-le dans votre fichier
Examinons le code du lien GitHub fourni :
"copyFiles-windows": [ "libs/*.dll" ], "lflags-windows": [ "/LIBPATH:$PACKAGE_DIR/libs" ], "libs": [ "pq" ]
Ce code définit une classe de modèle Model en D. Voici une répartition de ses composants clés :
Nous avons écrit tout le code pour travailler. Faisons-en une bibliothèque. ajoutez ceci sur votre dub.json
dub init <project_name>
Créons un nouveau projet :
"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" ],
ajouter la bibliothèque comme dépendance dans dub.json
"copyFiles-windows": [ "libs/*.dll" ], "lflags-windows": [ "/LIBPATH:$PACKAGE_DIR/libs" ], "libs": [ "pq" ]
app.d
sudo apt-get install libpq-dev
Décomposons le code et expliquons ses principaux composants :
Le code importe les modules nécessaires de la bibliothèque standard et de la bibliothèque séqualisée :
La fonction principale montre comment utiliser la bibliothèque Sequalized :
Cette classe définit un modèle pour la table de la base de données :
Je n'ai pas inclus le processus complet, et c'est à vous de le découvrir :)
Si vous aimeriez contribuer à mon projet voici le lien pour le repo :
https://github.com/rodevasia/sequelized
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!