저는 항상 새로운 프로그래밍 언어와 프레임워크에 대해 호기심이 많았습니다. 그동안 내 경험과 호기심은 프론트엔드 개발에만 퍼졌습니다(백엔드도 좀 해봤죠?). 기술을 확장하기 위해 도전했고 D 프로그래밍 언어를 발견했습니다. D는 쉽게 말하면 C와 CPP의 고급 버전입니다.
D란 무엇인가요? 웹사이트에는 '**D 는 정적 타이핑, 시스템 수준 액세스 및 C와 유사한 구문을 갖춘 범용 프로그래밍 언어입니다. D 프로그래밍 언어를 사용하면 빠르게 쓰고, 빠르게 읽고, 빠르게 실행할 수 있습니다.”
저는 작품의 데이터베이스로 PostgreSQL을 사용해왔고, 그래서 이 라이브러리에도 PostgreSQL을 선택했습니다. PostgreSQL은 현재 기업들이 사용하고 있는 주요 오픈소스 SQL 데이터베이스 시스템 중 하나이며 그 기능은 더욱 확장되고 있습니다.
D 언어를 망칠 때 내 요구 사항을 충족하는 패키지 하나를 찾을 수 없었습니다. 패키지가 유지 관리를 중지했거나 직접 쿼리용으로 사용할 수 있었습니다. JavaScript 배경에서 Sequalize ORM을 사용했습니다. 저에게 아이디어가 생겼는데, D에서도 비슷한 아이디어는 어떠세요?
그래서 좀 조사한 결과 Postgres가 C용 라이브러리를 제공한다는 것을 알게 되었습니다. 그러던 중 D에서 C 바인딩을 사용하고 이를 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 | 더디 블로그
이제 템플릿 클래스를 만들어 보겠습니다.
model.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" ]
app.d
sudo apt-get install libpq-dev
코드를 분석하고 주요 구성 요소를 설명하겠습니다.
코드는 표준 라이브러리와 Sequalized 라이브러리에서 필요한 모듈을 가져옵니다.
주 함수는 Sequalized 라이브러리를 사용하는 방법을 보여줍니다.
이 클래스는 데이터베이스 테이블의 모델을 정의합니다.
전체 과정은 포함하지 않았으니 알아보시기 바랍니다 :)
내 프로젝트에 기여하고 싶다면 저장소 링크를 확인하세요.
https://github.com/rodevasia/sequelized
위 내용은 D로 PostgreSQL 라이브러리 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!