Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Önemli
PostgreSQL için Azure Cosmos DB artık yeni projeler için desteklenmemektedir. Bu hizmeti yeni projeler için kullanmayın. Bunun yerine, şu iki hizmetlerden birini kullanın:
99,999% kullanılabilirlik hizmet düzeyi sözleşmesi (SLA), anında otomatik ölçeklendirme ve birden çok bölgede otomatik yük devretme ile yüksek ölçekli senaryolar için tasarlanmış dağıtılmış bir veritabanı çözümü için NoSQL için Azure Cosmos DB kullanın.
Açık kaynak Citus uzantısını kullanarak bölümlenmiş Azure Veritabanı'nın PostgreSQL için Elastik Kümeler özelliğini kullanın.
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.
<cluster>’ı küme adınızla ve <password>’ı yönetici parolanızla veya Microsoft Entra ID belirteciyle 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, <cluster> yerine küme adınızı ve <password> yerine yönetici parolanızı yazın.
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, <cluster> yerine küme adınızı ve <password> yerine yönetici parolanızı yazın.
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, <cluster> yerine küme adınızı ve <password> yerine yönetici parolanızı yazın.
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
Verileri sil
DELETE SQL deyimini kullanarak bağlanmak ve verileri silmek için aşağıdaki kodu kullanın. Kodda, <cluster> yerine küme adınızı ve <password> yerine yönetici parolanızı yazın.
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, <cluster> yerine küme adınızı ve <password> yerine yönetici parolanızı yazın.
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, <cluster> yerine küme adınızı ve <password> yerine yönetici parolanızı yazın.
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, <cluster> yerine küme adınızı ve <password> yerine yönetici parolanızı yazın.
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