Använda Ruby för att ansluta och köra SQL-kommandon i Azure Cosmos DB för PostgreSQL
GÄLLER FÖR: Azure Cosmos DB for PostgreSQL (drivs av Citus-databastillägget till PostgreSQL)
Den här snabbstarten visar hur du använder Ruby-kod för att ansluta till ett kluster och använder SQL-instruktioner för att skapa en tabell. Sedan infogar, frågar, uppdaterar och tar du bort data i databasen. Stegen i den här artikeln förutsätter att du är bekant med Ruby-utveckling och är nybörjare på att arbeta med Azure Cosmos DB för PostgreSQL.
Installera PostgreSQL-biblioteket
Kodexemplen i den här artikeln kräver pg gem. Du måste installera pg med språkpakethanteraren (till exempel bundler).
Ansluta, skapa en tabell och infoga data
Använd följande kod för att ansluta och skapa en tabell med hjälp av SQL-instruktionen CREATE TABLE och lägg sedan till rader i tabellen med instruktionen INSERT INTO SQL. Koden använder ett PG::Connection
objekt med konstruktorn för att ansluta till Azure Cosmos DB för PostgreSQL. Sedan anropas metoden exec()
för att köra kommandona DROP, CREATE TABLE och INSERT INTO. Koden söker efter fel med hjälp av PG::Error
klassen. Sedan anropas metoden close()
för att stänga anslutningen innan den avslutas.
I koden ersätter du <klustret> med ditt klusternamn och <lösenord> med administratörslösenordet eller Microsoft Entra-ID-token.
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
Distribuera tabeller
Azure Cosmos DB for PostgreSQL ger dig superkraften att distribuera tabeller över flera noder för skalbarhet. Med kommandot nedan kan du distribuera en tabell. Du kan läsa mer om create_distributed_table
och distributionskolumnen här.
Kommentar
Genom att distribuera tabeller kan de växa över alla arbetsnoder som läggs till i klustret.
Använd följande kod för att ansluta till databasen och distribuera tabellen. I koden ersätter du <klustret> med ditt klusternamn och <lösenord> med administratörslösenordet.
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
Läsa data
Använd följande kod för att ansluta och läsa data med en SELECT-SQL-instruktion.
Koden anropar metoden exec()
för att köra SELECT-kommandot och behåller resultatet i en resultatuppsättning. Resultatuppsättningssamlingen itereras med hjälp av do-loopen resultSet.each
och behåller de aktuella radvärdena i radvariabeln. I koden ersätter du <klustret> med ditt klusternamn och <lösenord> med administratörslösenordet.
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
Uppdatera data
Använd följande kod för att ansluta och uppdatera data med hjälp av en UPDATE SQL-instruktion. I koden ersätter du <klustret> med ditt klusternamn och <lösenord> med administratörslösenordet.
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
Ta bort data
Använd följande kod för att ansluta och läsa data med SQL-instruktionen DELETE. I koden ersätter du <klustret> med ditt klusternamn och <lösenord> med administratörslösenordet.
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
COPY-kommando för supersnabb inmatning
COPY-kommandot kan ge ett enormt dataflöde när data matas in i Azure Cosmos DB for PostgreSQL. Kommandot COPY kan mata in data i filer eller från mikrobats med data i minnet för inmatning i realtid.
COPY-kommando för att läsa in data från en fil
Följande kod kopierar data från en CSV-fil till en databastabell. Det kräver filen pharmacies.csv. I koden ersätter du <klustret> med ditt klusternamn och <lösenord> med administratörslösenordet.
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
COPY-kommandot för att läsa in minnesintern data
Följande kod kopierar minnesintern data till en tabell. I koden ersätter du <klustret> med ditt klusternamn och <lösenord> med administratörslösenordet.
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
Försök igen för fel med databasbegäran
Det är ibland möjligt att databasbegäranden från ditt program misslyckas. Sådana problem kan inträffa i olika scenarier, till exempel nätverksfel mellan app och databas, felaktigt lösenord osv. Vissa problem kan vara tillfälliga och lösa sig själva inom några sekunder till minuter. Du kan konfigurera omprövningslogik i appen för att lösa de tillfälliga felen.
Om du konfigurerar omförsökslogik i din app kan du förbättra slutanvändarupplevelsen. Under felscenarier väntar användarna bara lite längre på att programmet ska hantera begäranden i stället för att uppleva fel.
Exemplet nedan visar hur du implementerar logik för återförsök i din app. Exempelkodfragmentet försöker en databasbegäran var 60:e sekund (upp till fem gånger) tills den lyckas. Antalet och frekvensen för återförsök kan konfigureras baserat på programmets behov.
I koden ersätter du <klustret> med ditt klusternamn och <lösenord> med administratörslösenordet.
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
Nästa steg
- Se hur Azure Cosmos DB for PostgreSQL API utökar PostgreSQL och prova användbara diagnostikfrågor
- Välj den bästa klusterstorleken för din arbetsbelastning
- Övervaka klusterprestanda