COPY, verileri PostgreSQL tabloları ve standart dosya sistemi dosyaları arasında taşır. COPY TO tablonun içeriğini dosyaya kopyalarken, COPY FROM dosyadaki verileri tabloya kopyalar. COPY TO ayrıca SELECT sorgusunun sonuçlarınıda kopyalayabilir yani sütun listesi belirtilirse COPY TO yalnızca belirtilen sütunlardaki verileri dosyaya kopyalar. COPY FROM için, dosyadaki her alan sırayla belirtilen sütuna eklenir. COPY FROM sütun listesinde belirtilmeyen tablo sütunları, varsayılan değerlerini alır.

  • COPY komutu PostgreSQL sunucusuna doğrudan dosyadan okuma veya dosyaya yazma talimatı verir bu nedenle dosya, PostgreSQL kullanıcısı tarafından erişilebilir olmalı.
  • COPY TO tarafından okunan tablo üzerinde SELECT ve COPY FROM ile değerlerin eklendiği tabldaa INSERT yetkilerinin olması gerekir.
  • COPY TO yalnızca tablolarla kullanılabilir, viewlerde kullanılamaz. Bununla birlikte viewin içeriğini kopyalamak istersek COPY komutunu sql sorgusu ile beslemeliyiz( COPY (SELECT * FROM country) TO ‘list_countries.copy’;).
  • COPY komutunda adlandırılan dosyalar, client uygulaması tarafından değil, doğrudan sunucu tarafından okunur veya yazılır. Bu nedenle, client da değil, veritabanı sunucusu makinesinde bulunmalı veya bu makine tarafından erişilebilir olmalıdır.
  • COPY ile psql’deki \copy’yi karıştırmamalıyız. \copy, COPY FROM STDIN veya COPY TO STDOUT’u çağırır ve ardından verileri psql client tarafından erişilebilen bir dosyada alır ve depolar. Bu nedenle, dosya erişilebilirliği ve erişim hakları, \ opy kullanıldığında sunucudan çok cliente bağlıdır.

Örnekler;
Aşağıdaki komut ile sütunlar arası ayıraç olarak dikey çubuğu (|) kullanarak tabloyu cliente kopyalar.

COPY country TO STDOUT (DELIMITER '|');

Aşağıdaki komut ile sütunlar arası ayıraç olarak boşluk kullanarak tabloyu istediğimiz dosyaya kopyalar.

COPY country TO '/database/data/test_data.copy' (DELIMITER ' ');

Aşağıdaki komut ile varolan tablomuza dosyadaki verileri aktarabiliriz.

COPY country FROM '/database/data/test_data.copy' (DELIMITER ' ');

İstediğimiz bir sorgunun sonucunu dosyaya yazdırabiliriz.

COPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO '/database/data/test_data.copy';

Alacağımız çıktıyı program ile sıkıştırarak almak istersek aşağıdaki komutu kullanabiliriz.

COPY country TO PROGRAM 'gzip > /database/data/test_data.copy.gz';

Sadece 2 sütunu almak istersek aşağıdaki komutu kullanabiliriz.

COPY country(col, col2) TO '/database/data/test_data.copy' DELIMITER ' ';

Binary formatta almak istersek aşağıdaki gibi alabiliriz.

COPY country TO STDOUT WITH BINARY;

CSV formatta almak istersek aşağıdaki gibi alabiliriz.

COPY country TO STDOUT WITH CSV;

CSV formattaki veriyi atmak istersek aşağıdaki komutu kullanabiliriz.
NOT : CSV dosyaları ile ilgili bilmemiz gereken birkaç temel terim vardır; DELIMITER – Sınırlayıcı, dosyanın her satırını sütunlara ayıran bir karakterdir; CSV dosyasında sınırlayıcı virgüldür. HEADER – Bir CSV dosyası oluşturulduğunda, başlık satırı, sütun adlarını içeren dosyanın ilk satırıdır. Sütun adlarının CSV dosyasına kopyalanmasını istemiyorsanız, HEADER’ı göz ardı edebilirsiniz.

COPY  country FROM  '/database/data/test_data.copy' WITH delimiter ','  CSV HEADER;

Mesela türkçe karakterleriniz varsa aşağıdaki gibi encoding kullanabilirsiniz .

COPY country  FROM  '/database/data/test_data.copy' WITH delimiter ','  CSV HEADER encoding 'WIN1254';

Mustafa Bektaş Tepe
İyi Çalışmalar

Loading