Použití Ruby k připojení a spouštění příkazů SQL ve službě Azure Cosmos DB for PostgreSQL

PLATÍ PRO: Azure Cosmos DB for PostgreSQL (využívá rozšíření databáze Citus na PostgreSQL)

V tomto rychlém startu se dozvíte, jak se pomocí kódu Ruby připojit ke clusteru a pomocí příkazů SQL vytvořit tabulku. Potom v databázi vložíte data, budete je dotazovat, aktualizovat a odstranit. Kroky v tomto článku předpokládají, že máte zkušenosti s vývojem v Ruby a začínáte pracovat se službou Azure Cosmos DB for PostgreSQL.

Instalace knihovny PostgreSQL

Příklady kódu v tomto článku vyžadují gem pg . Nástroj pg budete muset nainstalovat pomocí správce jazykových balíčků (například bundler).

Připojení, vytvoření tabulky a vložení dat

Pomocí následujícího kódu se připojte a vytvořte tabulku pomocí příkazu CREATE TABLE SQL a pak přidejte řádky do tabulky pomocí příkazu INSERT INTO SQL. Kód používá objekt s konstruktorem PG::Connection pro připojení ke službě Azure Cosmos DB for PostgreSQL. Pak volá metodu exec() pro spuštění příkazů DROP, CREATE TABLE a INSERT INTO. Kód kontroluje chyby pomocí PG::Error třídy . Pak zavolá metodu close() pro ukončení připojení před ukončením.

V kódu nahraďte <cluster> názvem clusteru a <heslem> svého správce.

require 'pg'
begin
    # NOTE: Replace <cluster> and <password> in the connection string.
    connection = PG::Connection.new("host=c-<cluster>.<uniqueID>.postgres.cosmos.azure.com port=5432 dbname=citus user=citus password=<password> sslmode=require")
    puts 'Successfully created connection to database'

    # Drop previous table of same name if one exists
    connection.exec('DROP TABLE IF EXISTS pharmacy;')
    puts 'Finished dropping table (if existed).'

    # Drop previous table of same name if one exists.
    connection.exec('CREATE TABLE pharmacy (pharmacy_id integer ,pharmacy_name text,city text,state text,zip_code integer);')
    puts 'Finished creating table.'

    # Insert some data into table.
    connection.exec("INSERT INTO pharmacy (pharmacy_id,pharmacy_name,city,state,zip_code) VALUES (0,'Target','Sunnyvale','California',94001);")
    connection.exec("INSERT INTO pharmacy (pharmacy_id,pharmacy_name,city,state,zip_code) VALUES (1,'CVS','San Francisco','California',94002);")
    puts 'Inserted 2 rows of data.'

    # Create index
    connection.exec("CREATE INDEX idx_pharmacy_id ON pharmacy(pharmacy_id);") 
rescue PG::Error => e
    puts e.message
ensure
    connection.close if connection
end

Distribuce tabulek

Azure Cosmos DB for PostgreSQL nabízí super výkon při distribuci tabulek napříč několika uzly pro zajištění škálovatelnosti. Následující příkaz umožňuje distribuovat tabulku. Další informace o create_distributed_table a distribučním sloupci najdete tady.

Poznámka

Distribuce tabulek umožňuje jejich růst napříč všemi pracovními uzly přidanou do clusteru.

Pomocí následujícího kódu se připojte k databázi a distribuujte tabulku. V kódu nahraďte <cluster> názvem clusteru a <heslem> svého správce.

require 'pg'
begin
    # NOTE: Replace <cluster> and <password> in the connection string.
    connection = PG::Connection.new("host=c-<cluster>.<uniqueID>.postgres.cosmos.azure.com port=5432 dbname=citus user=citus password=<password> sslmode=require")
    puts 'Successfully created connection to database.'

    # Super power of distributed tables.
    connection.exec("select create_distributed_table('pharmacy','pharmacy_id');") 
rescue PG::Error => e
    puts e.message
ensure
    connection.close if connection
end

Čtení dat

Pomocí následujícího kódu se připojte a načtěte data s využitím příkazu SELECT jazyka SQL.

Kód volá metodu exec() pro spuštění příkazu SELECT a výsledky ponechá v sadě výsledků. Kolekce sady výsledků se iteuje pomocí smyčky resultSet.each do a udržuje aktuální hodnoty řádků v proměnné řádku. V kódu nahraďte <cluster> názvem clusteru a <heslem> svého správce.

require 'pg'
begin
    # NOTE: Replace <cluster> and <password> in the connection string.
    connection = PG::Connection.new("host=c-<cluster>.<uniqueID>.postgres.cosmos.azure.com port=5432 dbname=citus user=citus password=<password> sslmode=require")
    puts 'Successfully created connection to database.'

    resultSet = connection.exec('SELECT * from pharmacy')
    resultSet.each do |row|
        puts 'Data row = (%s, %s, %s, %s, %s)' % [row['pharmacy_id'], row['pharmacy_name'], row['city'], row['state'], row['zip_code ']]
    end
rescue PG::Error => e
    puts e.message
ensure
    connection.close if connection
end

Aktualizace dat

Pomocí následujícího kódu se připojte a aktualizujte data pomocí příkazu UPDATE SQL. V kódu nahraďte <cluster> názvem clusteru a <heslem> svého správce.

require 'pg'
begin
    # NOTE: Replace <cluster> and <password> in the connection string.
    connection = PG::Connection.new("host=c-<cluster>.<uniqueID>.postgres.cosmos.azure.com port=5432 dbname=citus user=citus password=<password> sslmode=require")
    puts 'Successfully created connection to database.'

    # Modify some data in table.
    connection.exec('UPDATE pharmacy SET city = %s WHERE pharmacy_id = %d;' % ['\'guntur\'',100])
    puts 'Updated 1 row of data.'
rescue PG::Error => e
    puts e.message
ensure
    connection.close if connection
end

Odstranění dat

Pomocí následujícího kódu se připojte a odstraňte data s využitím příkazu DELETE jazyka SQL. V kódu nahraďte <cluster> názvem clusteru a <heslem> svého správce.

require 'pg'
begin
    # NOTE: Replace <cluster> and <password> in the connection string.
    connection = PG::Connection.new("host=c-<cluster>.<uniqueID>.postgres.cosmos.azure.com port=5432 dbname=citus user=citus password=<password> sslmode=require")
    puts 'Successfully created connection to database.'

    # Delete some data in table.
    connection.exec('DELETE FROM pharmacy WHERE city = %s;' % ['\'guntur\''])
    puts 'Deleted 1 row of data.'
rescue PG::Error => e
    puts e.message
ensure
    connection.close if connection
end

Příkaz COPY pro superrychlý příjem dat

Příkaz COPY může při ingestování dat do služby Azure Cosmos DB for PostgreSQL poskytovat obrovskou propustnost . Příkaz COPY může ingestovat data v souborech nebo z mikrodávek dat v paměti pro příjem dat v reálném čase.

Příkaz COPY pro načtení dat ze souboru

Následující kód zkopíruje data ze souboru CSV do databázové tabulky. Vyžaduje souborpharmacies.csv. V kódu nahraďte <cluster> názvem clusteru a <heslem> svého správce.

require 'pg'
begin
    filename = String('pharmacies.csv')

    # NOTE: Replace <cluster> and <password> in the connection string.
    connection = PG::Connection.new("host=c-<cluster>.<uniqueID>.postgres.cosmos.azure.com port=5432 dbname=citus user=citus password=<password> sslmode=require")
    puts 'Successfully created connection to database.'

    # Copy the data from Csv to table.
    result = connection.copy_data "COPY pharmacy FROM STDIN with csv" do
        File.open(filename , 'r').each do |line|
            connection.put_copy_data line
        end
    puts 'Copied csv data successfully.'
    end      
rescue PG::Error => e
    puts e.message
ensure
    connection.close if connection
end

Příkaz COPY pro načtení dat v paměti

Následující kód zkopíruje data v paměti do tabulky. V kódu nahraďte <cluster> názvem clusteru a <heslem> svého správce.

require 'pg'
begin
    # NOTE: Replace <cluster> and <password> in the connection string.
    connection = PG::Connection.new("host=c-<cluster>.<uniqueID>.postgres.cosmos.azure.com port=5432 dbname=citus user=citus password=<password> sslmode=require")
    puts 'Successfully created connection to database.'

    enco = PG::TextEncoder::CopyRow.new
    connection.copy_data "COPY pharmacy FROM STDIN", enco do
        connection.put_copy_data [5000,'Target','Sunnyvale','California','94001']
        connection.put_copy_data [5001, 'CVS','San Francisco','California','94002']
        puts 'Copied in-memory data successfully.'
    end
rescue PG::Error => e
    puts e.message
ensure
    connection.close if connection
end

Opakování pokusu aplikace o selhání žádostí o databázi

Někdy je možné, že žádosti o databázi z vaší aplikace selžou. K takovým problémům může docházet v různých scénářích, jako je selhání sítě mezi aplikací a databází, nesprávné heslo atd. Některé problémy můžou být přechodné a samy se vyřeší během několika sekund až minut. V aplikaci můžete nakonfigurovat logiku opakování, aby se přechodné chyby vyřešily.

Konfigurace logiky opakování ve vaší aplikaci pomáhá zlepšit prostředí koncového uživatele. Ve scénářích selhání budou uživatelé pouze chvíli čekat, než aplikace obslouží požadavky, místo aby došlo k chybám.

Následující příklad ukazuje, jak do aplikace implementovat logiku opakování. Ukázkový fragment kódu zkouší požadavek databáze každých 60 sekund (až pětkrát), dokud nebude úspěšný. Počet a četnost opakování je možné nakonfigurovat na základě potřeb vaší aplikace.

V kódu nahraďte <cluster> názvem clusteru a <heslem> svého správce.

require 'pg'

def executeretry(sql,retryCount)
  begin
    for a in 1..retryCount do
      begin
        # NOTE: Replace <cluster> and <password> in the connection string.
        connection = PG::Connection.new("host=c-<cluster>.<uniqueID>.postgres.cosmos.azure.com port=5432 dbname=citus user=citus password=<password> sslmode=require")
        resultSet = connection.exec(sql)
        return resultSet.each
      rescue PG::Error => e
        puts e.message
        sleep 60
      ensure
        connection.close if connection
      end
    end
  end
  return nil
end

var = executeretry('select 1',5)

if var !=nil then
  var.each do |row|
    puts 'Data row = (%s)' % [row]
  end
end

Další kroky