PostgreSQL için Azure Cosmos DB'de SQL komutlarını bağlamak ve çalıştırmak için Ruby kullanma
ŞUNLAR IÇIN GEÇERLIDIR: PostgreSQL için Azure Cosmos DB (PostgreSQL'e citus veritabanı uzantısıyla desteklenir)
Bu hızlı başlangıçta ruby kodunu kullanarak bir kümeye bağlanma ve SQL deyimlerini kullanarak tablo oluşturma işlemleri gösterilmektedir. Ardından veritabanına veri ekler, sorgular, güncelleştirir ve silersiniz. Bu makaledeki adımlarda Ruby geliştirme hakkında bilgi sahibi olduğunuz ve PostgreSQL için Azure Cosmos DB ile çalışmaya yeni olduğunuz varsayılır.
PostgreSQL kitaplığını yükleme
Bu makaledeki kod örnekleri için pg gem gereklidir. Dil paketi yöneticinize (paketleyici gibi) pg yüklemeniz gerekir.
Bağlanma, tablo oluşturma ve veri ekleme
CREATE TABLE SQL deyimini kullanarak bağlanmak ve tablo oluşturmak için aşağıdaki kodu kullanın, ardından INSERT INTO SQL deyimini kullanarak tabloya satır ekleyin. Kod, PostgreSQL için Azure Cosmos DB'ye bağlanmak için oluşturuculu bir PG::Connection
nesne kullanır. Ardından DROP, CREATE TABLE ve INSERT INTO komutlarını çalıştırmak için yöntemini exec()
çağırır. Kod, sınıfını PG::Error
kullanarak hataları denetler. Ardından sonlandırmadan önce bağlantıyı kapatmak için yöntemini close()
çağırır.
Kodda, kümeyi küme> adınızla ve <parolanızla> yönetici parolanızla değiştirin<.
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
Tabloları dağıtma
PostgreSQL için Azure Cosmos DB, ölçeklenebilirlik için tabloları birden çok düğüme dağıtmanın süper gücünü sağlar. Aşağıdaki komut bir tabloyu dağıtmanıza olanak tanır. Ve dağıtım sütunu hakkında create_distributed_table
daha fazla bilgiyi burada bulabilirsiniz.
Not
Tabloların dağıtılması, kümeye eklenen tüm çalışan düğümleri arasında büyümelerini sağlar.
Veritabanına bağlanmak ve tabloyu dağıtmak için aşağıdaki kodu kullanın. Kodda, kümeyi küme> adınızla ve <parolanızla> yönetici parolanızla değiştirin<.
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
Verileri okuma
SELECT SQL deyimini kullanarak bağlanmak ve verileri okumak için aşağıdaki kodu kullanın.
Kod, sonuçları bir sonuç kümesinde tutarak SELECT komutunu çalıştırmak için yöntemini exec()
çağırır. Sonuç kümesi koleksiyonu do döngüsü kullanılarak resultSet.each
yinelenir ve geçerli satır değerleri satır değişkeninde kalır. Kodda, kümeyi küme> adınızla ve <parolanızla> yönetici parolanızla değiştirin<.
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
Verileri güncelleştirme
UPDATE SQL deyimini kullanarak bağlanmak ve verileri güncelleştirmek için aşağıdaki kodu kullanın. Kodda, kümeyi küme> adınızla ve <parolanızla> yönetici parolanızla değiştirin<.
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
Veri silme
DELETE SQL deyimini kullanarak bağlanmak ve verileri silmek için aşağıdaki kodu kullanın. Kodda, kümeyi küme> adınızla ve <parolanızla> yönetici parolanızla değiştirin<.
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
Süper hızlı alma için COPY komutu
COPY komutu, PostgreSQL için Azure Cosmos DB'ye veri alırken muazzam aktarım hızı sağlayabilir. COPY komutu, gerçek zamanlı veri alımı için dosyalardaki veya bellekteki mikro veri toplu işlemlerinden veri alabilir.
Bir dosyadan veri yüklemek için COPY komutu
Aşağıdaki kod verileri csv dosyasından veritabanı tablosuna kopyalar. Dosya pharmacies.csv gerektirir. Kodda, kümeyi küme> adınızla ve <parolanızla> yönetici parolanızla değiştirin<.
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
Bellek içi verileri yüklemek için COPY komutu
Aşağıdaki kod bellek içi verileri bir tabloya kopyalar. Kodda, kümeyi küme> adınızla ve <parolanızla> yönetici parolanızla değiştirin<.
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
Veritabanı isteği hataları için uygulama yeniden denemesi
Bazen uygulamanızdan gelen veritabanı istekleri başarısız olabilir. Bu tür sorunlar, uygulama ve veritabanı arasındaki ağ hatası, yanlış parola vb. gibi farklı senaryolarda oluşabilir. Bazı sorunlar geçici olabilir ve birkaç saniye ile dakika arasında çözülebilir. Geçici hataların üstesinden gelmek için uygulamanızda yeniden deneme mantığını yapılandırabilirsiniz.
Uygulamanızda yeniden deneme mantığını yapılandırmak, son kullanıcı deneyimini geliştirmeye yardımcı olur. Hata senaryolarında kullanıcılar, hatalarla karşılaşmak yerine uygulamanın isteklere hizmet vermesini yalnızca biraz daha bekler.
Aşağıdaki örnekte, uygulamanızda yeniden deneme mantığının nasıl uygulandığı gösterilmektedir. Örnek kod parçacığı, başarılı olana kadar her 60 saniyede bir (en fazla beş kez) bir veritabanı isteği dener. Yeniden deneme sayısı ve sıklığı, uygulamanızın gereksinimlerine göre yapılandırılabilir.
Kodda, kümeyi küme> adınızla ve <parolanızla> yönetici parolanızla değiştirin<.
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
Sonraki adımlar
- PostgreSQL için Azure Cosmos DB API'sinin PostgreSQL'i nasıl genişlettiklerini görün ve yararlı tanılama sorgularını deneyin
- İş yükünüz için en iyi küme boyutunu seçin
- Küme performansını izleme
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin