खोज…


.NET से Postgresql तक पहुँच Npgsql प्रदाता का उपयोग कर

Postgresql के लिए अधिक लोकप्रिय .NET प्रदाताओं में से एक Npgsql है , जो ADO.NET संगत है और अन्य .NET डेटाबेस प्रदाताओं के रूप में लगभग पहचाना जाता है।

एक सामान्य क्वेरी कमांड, बाइंडिंग पैरामीटर और फिर कमांड निष्पादित करके बनाई जाती है। C # में:

var connString = "Host=myserv;Username=myuser;Password=mypass;Database=mydb";
using (var conn = new NpgsqlConnection(connString))
{
    var querystring = "INSERT INTO data (some_field) VALUES (@content)";
    
    conn.Open();
    // Create a new command with CommandText and Connection constructor
    using (var cmd = new NpgsqlCommand(querystring, conn))
    {
        // Add a parameter and set its type with the NpgsqlDbType enum
        var contentString = "Hello World!";
        cmd.Parameters.Add("@content", NpgsqlDbType.Text).Value = contentString;

        // Execute a query that returns no results
        cmd.ExecuteNonQuery();


        /* It is possible to reuse a command object and open connection instead of creating new ones */

        // Create a new query and set its parameters
        int keyId = 101;
        cmd.CommandText = "SELECT primary_key, some_field FROM data WHERE primary_key = @keyId";
        cmd.Parameters.Clear();
        cmd.Parameters.Add("@keyId", NpgsqlDbType.Integer).Value = keyId;

        // Execute the command and read through the rows one by one
        using (NpgsqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())   // Returns false for 0 rows, or after reading the last row of the results
            {
                // read an integer value
                int primaryKey = reader.GetInt32(0);
                // or 
                primaryKey = Convert.ToInt32(reader["primary_key"]);

                // read a text value
                string someFieldText = reader["some_field"].ToString();
            }
        }
    }
}    // the C# 'using' directive calls conn.Close() and conn.Dispose() for us

C-API के साथ PostgreSQL एक्सेस करना

C-API PostgreSQL तक पहुंचने का सबसे शक्तिशाली तरीका है और यह आश्चर्यजनक रूप से आरामदायक है।

संकलन और लिंकिंग

संकलन के दौरान, आपको PostgreSQL शामिल निर्देशिका को जोड़ना होगा, जिसे pg_config --includedir साथ शामिल किया जा सकता है, जिसमें पथ शामिल है।
आप (PostgreSQL ग्राहक साझा लाइब्रेरी के साथ लिंक करना होगा libpq.so , यूनिक्स पर libpq.dll Windows पर)। यह लाइब्रेरी PostgreSQL लाइब्रेरी डायरेक्टरी में है, जिसे pg_config --libdir साथ पाया जा सकता है।

नोट: ऐतिहासिक कारण से, पुस्तकालय कहा जाता है libpq.so और नहीं libpg.so , जो शुरुआती के लिए एक लोकप्रिय जाल है।

यह देखते हुए कि नीचे कोड नमूना फ़ाइल coltype.c , संकलन और लिंकिंग के साथ किया जाएगा

gcc -Wall -I "$(pg_config --includedir)" -L "$(pg_config --libdir)" -o coltype coltype.c -lpq

GNU C कंपाइलर (जोड़ने पर विचार करें -Wl,-rpath,"$(pg_config --libdir)" लाइब्रेरी खोज पथ को जोड़ने के लिए) या के साथ

cl /MT /W4 /I <include directory> coltype.c <path to libpq.lib>

माइक्रोसॉफ्ट विजुअल सी के साथ विंडोज पर।

नमूना कार्यक्रम

/* necessary for all PostgreSQL client programs, should be first */
#include <libpq-fe.h>

#include <stdio.h>
#include <string.h>

#ifdef TRACE
#define TRACEFILE "trace.out"
#endif

int main(int argc, char **argv) {
#ifdef TRACE
    FILE *trc;
#endif
    PGconn *conn;
    PGresult *res;
    int rowcount, colcount, i, j, firstcol;
    /* parameter type should be guessed by PostgreSQL */
    const Oid paramTypes[1] = { 0 };
    /* parameter value */
    const char * const paramValues[1] = { "pg_database" };

    /*
     * Using an empty connectstring will use default values for everything.
     * If set, the environment variables PGHOST, PGDATABASE, PGPORT and
     * PGUSER will be used.
     */
    conn = PQconnectdb("");

    /*
     * This can only happen if there is not enough memory
     * to allocate the PGconn structure.
     */
    if (conn == NULL)
    {
        fprintf(stderr, "Out of memory connecting to PostgreSQL.\n");
        return 1;
    }

    /* check if the connection attempt worked */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "%s\n", PQerrorMessage(conn));
        /*
         * Even if the connection failed, the PGconn structure has been
         * allocated and must be freed.
         */
        PQfinish(conn);
        return 1;
    }

#ifdef TRACE
    if (NULL == (trc = fopen(TRACEFILE, "w")))
    {
        fprintf(stderr, "Error opening trace file \"%s\"!\n", TRACEFILE);
        PQfinish(conn);
        return 1;
    }

    /* tracing for client-server communication */
    PQtrace(conn, trc);
#endif

    /* this program expects the database to return data in UTF-8 */
    PQsetClientEncoding(conn, "UTF8");

    /* perform a query with parameters */
    res = PQexecParams(
        conn,
        "SELECT column_name, data_type "
            "FROM information_schema.columns "
            "WHERE table_name = $1",
        1,            /* one parameter */
        paramTypes,        
        paramValues,
        NULL,        /* parameter lengths are not required for strings */
        NULL,        /* all parameters are in text format */
        0            /* result shall be in text format */
    );

    /* out of memory or sever communication broken */
    if (NULL == res)
    {
        fprintf(stderr, "%s\n", PQerrorMessage(conn));
        PQfinish(conn);
#ifdef TRACE
        fclose(trc);
#endif
        return 1;
    }

    /* SQL statement should return results */
    if (PGRES_TUPLES_OK != PQresultStatus(res))
    {
        fprintf(stderr, "%s\n", PQerrorMessage(conn));
        PQfinish(conn);
#ifdef TRACE
        fclose(trc);
#endif
        return 1;
    }

    /* get count of result rows and columns */
    rowcount = PQntuples(res);
    colcount = PQnfields(res);

    /* print column headings */
    firstcol = 1;

    printf("Description of the table \"pg_database\"\n");

    for (j=0; j<colcount; ++j)
    {
        if (firstcol)
            firstcol = 0;
        else
            printf(": ");

        printf(PQfname(res, j));
    }

    printf("\n\n");

    /* loop through rosult rows */
    for (i=0; i<rowcount; ++i)
    {
        /* print all column data */
        firstcol = 1;

        for (j=0; j<colcount; ++j)
        {
            if (firstcol)
                firstcol = 0;
            else
                printf(": ");

            printf(PQgetvalue(res, i, j));
        }

        printf("\n");
    }

    /* this must be done after every statement to avoid memory leaks */
    PQclear(res);
    /* close the database connection and release memory */
    PQfinish(conn);
#ifdef TRACE
    fclose(trc);
#endif
    return 0;
}

Psycopg2 का उपयोग करके अजगर से PostgreSQL तक पहुँचना

आप यहां ड्राइवर का वर्णन पा सकते हैं।

त्वरित उदाहरण है:

import psycopg2

db_host = 'postgres.server.com'
db_port = '5432'
db_un = 'user'
db_pw = 'password'
db_name = 'testdb'

conn = psycopg2.connect("dbname={} host={} user={} password={}".format(
                         db_name,  db_host, db_un, db_pw),
                         cursor_factory=RealDictCursor)
cur = conn.cursor()
sql = 'select * from testtable where id > %s and id < %s'
args = (1, 4)
cur.execute(sql, args)

print(cur.fetchall())

परिणाम होगा:

[{'id': 2, 'fruit': 'apple'}, {'id': 3, 'fruit': 'orange'}]

POM2 का उपयोग करके PHP से PostgreSQL तक पहुँचना

निम्न स्तर के ड्राइवरों के कंधे पर, पोम है । यह एक मॉड्यूलर दृष्टिकोण, डेटा कन्वर्टर्स, सुनो / सूचित समर्थन, डेटाबेस निरीक्षक और बहुत कुछ का प्रस्ताव करता है।

यह मानते हुए, पोम को संगीतकार के उपयोग से स्थापित किया गया है, यहाँ एक पूर्ण उदाहरण है:

<?php
use PommProject\Foundation\Pomm;
$loader = require __DIR__ . '/vendor/autoload.php';
$pomm = new Pomm(['my_db' => ['dsn' => 'pgsql://user:pass@host:5432/db_name']]);

// TABLE comment (
// comment_id uuid PK, created_at timestamptz NN,
// is_moderated bool NN default false,
// content text NN CHECK (content !~ '^\s+$'), author_email text NN)
$sql = <<<SQL
SELECT
  comment_id,
  created_at,
  is_moderated,
  content,
  author_email
FROM comment
  INNER JOIN author USING (author_email)
WHERE
  age(now(), created_at) < $*::interval
ORDER BY created_at ASC
SQL;

// the argument will be converted as it is cast in the query above
$comments = $pomm['my_db']
    ->getQueryManager()
    ->query($sql, [DateInterval::createFromDateString('1 day')]);

if ($comments->isEmpty()) {
    printf("There are no new comments since yesterday.");
} else {
    foreach ($comments as $comment) {
        printf(
                "%s has posted at %s. %s\n",
                $comment['author_email'],
                $comment['created_at']->format("Y-m-d H:i:s"),
                $comment['is_moderated'] ? '[OK]' : '');
    }
}

Pomm का क्वेरी मैनेजर मॉड्यूल SQL इंजेक्शन को रोकने के लिए क्वेरी तर्कों से बच जाता है। जब तर्क दिए जाते हैं, तो यह उन्हें एक PHP प्रतिनिधित्व से वैध पोस्टग्रेज मानों में परिवर्तित करता है। परिणाम एक पुनरावृत्ति है, यह आंतरिक रूप से एक कर्सर का उपयोग करता है। हर पंक्ति को मक्खी, बूलियन से बूलियन, टाइमस्टैम्प से \ DateTime आदि में परिवर्तित किया जाता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow