SQL-parancsok csatlakoztatása és futtatása a Ruby használatával az Azure Cosmos DB for PostgreSQL-ben
A KÖVETKEZŐKRE VONATKOZIK: Azure Cosmos DB for PostgreSQL (a Citus adatbázisbővítménye a PostgreSQL-re)
Ez a rövid útmutató bemutatja, hogyan csatlakozhat Ruby-kóddal egy fürthöz, és hogyan hozhat létre sql-utasításokat egy tábla létrehozásához. Ezután adatokat szúrhat be, kérdezhet le, frissíthet és törölhet az adatbázisban. A cikk lépései feltételezik, hogy ismeri a Ruby-fejlesztést, és még nem ismeri az Azure Cosmos DB for PostgreSQL-et.
A PostgreSQL-kódtár telepítése
A cikkben szereplő példakódhoz szükség van a pg gemre. Telepítenie kell a pg-t a nyelvi csomagkezelővel (például a bundlerrel).
Csatlakozás, tábla létrehozása és adatok beszúrása
A következő kóddal csatlakozhat és létrehozhat egy táblát a CREATE TABLE SQL utasítással, majd az INSERT INTO SQL utasítással sorokat adhat hozzá a táblához. A kód egy PG::Connection
konstruktort használó objektumot használ az Azure Cosmos DB for PostgreSQL-hez való csatlakozáshoz. Ezután metódust hív exec()
meg a DROP, a CREATE TABLE és az INSERT INTO parancs futtatásához. A kód az osztály használatával ellenőrzi a PG::Error
hibákat. Ezután meghívja a metódust close()
, hogy zárja be a kapcsolatot a megszakítás előtt.
A kódban cserélje le <a fürtöt> a fürt nevére és <jelszavára> a rendszergazdai jelszóra.
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
Táblák elosztása
Az Azure Cosmos DB for PostgreSQL lehetővé teszi a táblák több csomópont közötti elosztását a méretezhetőség érdekében. Az alábbi parancs lehetővé teszi egy tábla terjesztését. Erről és a terjesztési oszlopról create_distributed_table
itt olvashat bővebben.
Feljegyzés
A táblák elosztása lehetővé teszi, hogy a fürthöz hozzáadott munkavégző csomópontok között növekedjenek.
Az alábbi kóddal csatlakozhat az adatbázishoz, és terjesztheti a táblát. A kódban cserélje le <a fürtöt> a fürt nevére és <jelszavára> a rendszergazdai jelszóra.
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
Adatok beolvasása
Az alábbi kód használatával csatlakozhat és végezheti el az adatok olvasását SELECT SQL-utasítás segítségével.
A SELECT parancs futtatásának kódhívási metódusa exec()
, amely eredményhalmazban tartja az eredményeket. Az eredményhalmaz-gyűjtemény a do ciklus használatával resultSet.each
van iterálva, megtartva az aktuális sorértékeket a sorváltozóban. A kódban cserélje le <a fürtöt> a fürt nevére és <jelszavára> a rendszergazdai jelszóra.
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
Adatok frissítése
Az alábbi kóddal csatlakozhat és frissítheti az adatokat egy UPDATE SQL-utasítás használatával. A kódban cserélje le <a fürtöt> a fürt nevére és <jelszavára> a rendszergazdai jelszóra.
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
Adatok törlése
Az alábbi kód használatával csatlakozhat és végezheti el az adatok törlését egy DELETE SQL-utasítás segítségével. A kódban cserélje le <a fürtöt> a fürt nevére és <jelszavára> a rendszergazdai jelszóra.
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 parancs szupergyors betöltéshez
A COPY parancs hatalmas átviteli sebességet eredményezhet, miközben adatokat tölt be az Azure Cosmos DB for PostgreSQL-be. A COPY parancs betöltheti az adatokat fájlokban, vagy a memóriában lévő adatok mikro kötegeiből valós idejű betöltéshez.
MÁSOLÁS parancs fájlból származó adatok betöltéséhez
Az alábbi kód egy CSV-fájlból egy adatbázistáblába másolja az adatokat. Ehhez a fájl pharmacies.csv szükséges. A kódban cserélje le <a fürtöt> a fürt nevére és <jelszavára> a rendszergazdai jelszóra.
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 parancs a memóriában lévő adatok betöltéséhez
Az alábbi kód a memóriában lévő adatokat egy táblába másolja. A kódban cserélje le <a fürtöt> a fürt nevére és <jelszavára> a rendszergazdai jelszóra.
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
Alkalmazás újrapróbálkozása az adatbázis-kérelmek hibáihoz
Előfordulhat, hogy az alkalmazás adatbázis-kérelmei sikertelenek. Az ilyen problémák különböző forgatókönyvek esetén fordulhatnak elő, például az alkalmazás és az adatbázis közötti hálózati hiba, helytelen jelszó stb. Egyes problémák átmenetiek lehetnek, és néhány másodperc és perc alatt megoldhatják magukat. Az átmeneti hibák elhárításához konfigurálhatja az újrapróbálkozási logikát az alkalmazásban.
Az újrapróbálkozási logika konfigurálása az alkalmazásban segít a végfelhasználói élmény javításában. Hibaforgatókönyvek esetén a felhasználók csupán egy kicsit tovább várnak, amíg az alkalmazás a kéréseket kiszolgálja ahelyett, hogy hibákat tapasztalnak.
Az alábbi példa bemutatja, hogyan implementálhatja az újrapróbálkozás logikáját az alkalmazásban. A mintakódrészlet 60 másodpercenként (legfeljebb ötször) kísérel meg egy adatbázis-kérést, amíg sikeres nem lesz. Az újrapróbálkozések száma és gyakorisága az alkalmazás igényei szerint konfigurálható.
A kódban cserélje le <a fürtöt> a fürt nevére és <jelszavára> a rendszergazdai jelszóra.
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
Következő lépések
- Tekintse meg, hogyan terjeszti ki az Azure Cosmos DB for PostgreSQL API a PostgreSQL-t, és próbálkozzon hasznos diagnosztikai lekérdezésekkel
- Válassza ki a legjobb fürtméretet a számítási feladathoz
- Fürtteljesítmény monitorozása
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: