PostgreSQL UUID veri tipi

18 May

Universally Unique Identifiers (UUID) olarak bilinen ve Postgresql veritabanında uuid olarak adlandırılan bir veri tipi bulunmaktadır. Bazı sistemler bu veri türünü genel olarak benzersiz bir tanımlayıcı veya GUID olarak adlandırır. Benzersiz olarak üretilmesi nedeniyle, dağıtık sistemler için bu veri türü, tek bir veritabanı içinde ID üretimi bakımından sıralı üreteçlerden daha iyi bir benzersizlik garantisi sağlar.

UUID veri tipi, tire işaretleriyle ayrılmış birkaç grup halinde ifade edilir. Özellikle 8 basamaklı ilk grup ve ardından 4 basamaklı üç grup ve onn ardından 12 basamaklı bir grup olarak küçük harfli onaltılık basamak dizisi olarak yazılır. Bu standart formdaki bir UUID örneği:

e0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11

PostgreSQL veri tabanı, ayrıca aşağıdaki UUID formlarını da kabul eder.

A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
a0eebc999c0b4ef8bb6d6bb9bd380a11
a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}

PostgreSQL veri tabanından benzersiz uuid üretebilmek için uuid-ossp eklentisinin aktif edilmesi gerekmektedir. Bu eklentiyi aktif etmek için aşağıdaki komut kullanılabilir.

CREATE EXTENSION "uuid-ossp";

Bu komutu çalıştırıldığında, Postgresql’e uuid üretebilen fonksiyonlar eklenmektedir.

  • uuid_generate_v1()
  • uuid_generate_v1mc()
  • uuid_generate_v4()
  • uuid_nil()

uuid_generate_v1()

Bilgisayarın MAC adresi, geçerli zaman damgası ve rastgele bir değer kombinasyonuna göre UUID değerleri oluşturmak için uuid_generate_v1 () işlevi kullanılır.

SELECT uuid_generate_v1();

uuid_generate_v1mc()

Bu fonksiyon, sürüm 1 UUID oluşturur, ancak bilgisayarın gerçek MAC adresi yerine rasgele multicast MAC adresi kullanır.

SELECT uuid_generate_v1mc();

uuid_generate_v4()

Yalnızca rastgele sayılara dayalı bir UUID değeri oluşturmak istiyorsanız uuid_generate_v4 () fonksiyonunu kullanabilirsiniz.

SELECT uuid_generate_v4();

uuid_nil()

Sadece sıfırlardan oluşan bir uuid değeri üretir.

SELECT uuid_nil();

Tabloda uuid Alanı Kullanımı

CREATE TABLE messeges (
    id uuid DEFAULT uuid_generate_v4(),
    content VARCHAR NOT NULL,
    PRIMARY KEY (id)
);

Tabloya veri girişi:

INSERT INTO messages 
    (content)
VALUES
    ('Hi'),
    ('This is'),
    ('my message');

Veri Boyutu ve Performans

uuid veri tipi 16 byte boyutunda binary değere sahiptir. Bu nedenle sorgularda çok büyük performans artışı sağlar. Aynı boyuttaki bir text ile karşılaştıracak olursak:

select
    pg_column_size('0fe5d76a-99b6-11ea-bb37-0242ac130002'::text) 
       as text_size,
    pg_column_size('0fe5d76a-99b6-11ea-bb37-0242ac130002'::uuid) 
       as uuid_size;


 text_size | uuid_size 
-----------+-----------
        40 |        16

Ubuntu 18.04 üzerine PostgreSQL 12 kurulumu

17 May

PostgreSQL veritabanı, Linux gibi tamamen ücretsizdir ve açık kaynak kodludur. Bu yazıda Linux Ubuntu 18.04 dağıtımı üzerine PostgreSQL kurulumu anlatılmaktadır.

Ubuntu 18.04 dağıtımı üzerine Postgresql 12 kurulumu yapmak için öncelikle repository paket versiyonunu kontrol etmek gerekmektedir. Repository paket kontrolünün nasıl yapıldığına bir önceki yazıdan ulaşabilirsiniz.

PostgreSQL Kurulumu

Ubuntu sürümünüzde bulunan PostgreSQL sürüm istediğiniz sürüm değilse, güncellemek için PostgreSQL Apt Repository kullanılabilir. Bunun için öncelikle yapılması gereken:

/etc/apt/sources.list.d/pgdg.list

dosyası oluşturmaktır. Bu dosyanın içerisine aşağıdaki satır eklenmelidir.

deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main

Daha sonra depo imzalama anahtarını (signing key) içe aktarılmalı ve paket listeleri güncellenmelidir.

sudo apt-get update

Artık ortam postgresql 12 yüklemesi için hazır durumdadır. Yükleme komutu:

sudo apt-get -y install postgresql-12 postgresql-client-12

Yükleme tamamlandığında, postgresql servisini başlatmak için gerekli komut:

sudo systemctl start postgresql

artık servis durumu kontrol edilebilir.

sudo systemctl status postgresql

PostgreSQL Bağlantısı

PostgreSQL kurulumu sonrasında Ubuntu kullanıcılarına postgres adında bir sistem kullanıcısı otomatik olarak oluşturulur. Başlangıçta, diğer kullanıcılar oluşturulana kadar bu kullanıcısı ile PostgreSQL’e bağlanmanız gerekir.

sudo su postgres

komutu ile postgres kullanıcısına geçilerek psql komutu çalıştırıldığında artık veritabanı komutlarını kullanabilirsiniz.

\l

komutu ile veritabanları listelenebilir.

\c postgres

komutu ile postgres veri tabanına bağlanabilirsiniz. (Kurulum sırasında postgres veritabanı otomatik olarak oluşturulur.)

Postgresql veritabanını konsol ortamından yönetmek biraz kullanışsızdır. Bunun yerine pgAdmin, Datagrip gibi araçlar tercih edilmelidir.

PostgreSQL Remote Ayarları

Postgresql sunucusu dışından bağlantı yapabilmek için uzak bağlantı ayarlarını yapmak gerekmektedir. Bu ayarlar aşağıdaki dosyada bulunmaktadır.

/etc/postgresql/12/main/postgresql.conf

Bu dosya vim editörü ile açılarak

listen_addresses = '*'

satırı açık konuma getirilmelidir.

Daha sonra,

etc/postgresql/12/main/pg_hba.conf

dosyasında ip tanımlaması yapılmalıdır. (hba: host based authentication)

  • “host   all   all   212.0.103.8/32   md5″ şeklinde ayarlama yaparsanız istediğiniz tek bir adresten erişim sağlayabilirsiniz. Bu ip dışından bağlantı sağlanamaz.
  • “host   all   all   0.0.0.0/0          md5″ şeklinde ayarlama yaparsanız herhangi bir ip üzerinden sunucuya bağlanabilirsiniz. Burada password authentication kimlik doğrulama yöntemi ve  md5 algoritması kullanılmıştır. (Postgresql veri tabanında ayrıca trust, ident, peer, GSSAPI, LDAP kimlik doğrulama yöntemleri de mevcuttur.)

(Postgre

Bu ayarların yapıldıktan sonra aktif olabilmesi için postgresql servisinin yeniden başlatılması gerekmektedir.

sudo systemctl restart postgresql

Artık veritabanına uzak bağlantı sağlanabilir.

ASP.NET Core geliştiriciler için yol haritası

5 Oca

2019 yılında, bir grup geliştirici, GitHub‘da ASP.NET Core geliştiriciler için bir yol haritası ortaya koymuşlar. Kaynağa buradan ulaşabilirsiniz.

Bu yazıda, her geliştirici için faydalı olabileceğini düşündüğüm bu yol haritasını sizlerle paylaşmak istedim.

Yol Haritası Boyunca Bilinmesi Gerekenler

  1. Öncelikle bilinmesi gerekenler.
    • C#
    • Entity Framework
    • ASP.NET Core
    • SQL Fundamentals
  2. Bilinmesi gereken genel geliştirme becerileri.
    • GIT sistemi öğrenilmeli, GitHub üzerinde yeni bir repository oluşturulabilmelidir, kod diğer geliştiricilerle paylaşılmalıdır.
    • HTTP(S) protokolü bilinmeli, http request metodları (GET, POST, PUT, PATCH, DELETE, OPTIONS) bilinmelidir.
    • Google kullanmaktan ve araştırmaktan korkmayın.
    • Dotnet CLI öğrenmelisiniz.
    • Veri yapıları ve algoritmalar hakkında bir kaç kitap okumalısınız.
  3. Dependency Injection (DI – Bağımlılıkların dışarıdan alınması)
  4. Veritabanları
  5. Cache Mekanizmaları
  6. Log Mekanizmaları
  7. Web site geliştirme şablonları (Template Engines)
  8. Gerçek zamanlı iletişim araçları (Realtime Communication)
  9. Nesne eşleştirme araçları (Object Mapping)
  10. API istemcileri (Clients)
  11. Bilinmesi faydalı olabilecek bilgiler
  12. Testler
  13. Görev zamanlayıcılar (Task scheduling)
  14. Mikro servisler (MicroServices)
  15. SOLID prensipleri
  16. Tasarım Kalıpları (Design-Patterns)

Yol Haritası Görseli

PostgreSQL Veritabanı ve Tablo Boyutları Nasıl Öğrenilir

9 Ara

PostgreSQL üzerinde tanımlanan bir veritabanı veya veritabanı üzerinde tablolarının boyutlarını öğrenmek mümkündür. Bu işlemler için PostgreSQL komutları kullanılır. Komutları, psql komut satırı veya PgAdmin gibi araçlar kullanılabilir.

1. Veritabanı boyutunu veren komut

Aşağıdaki komutta ‘veritabanı_adı’ kısmına kendi veritabanınızı yazabilirsiniz.

SELECT pg_size_pretty(pg_database_size('veritabanı_adı'));

2. Veritabanı tablo boyutunu veren komut

Aşağıdaki komutta ‘tablo_adı‘ kısmına kendi veritabanı tablo adınızı yazabilirsiniz.

SELECT pg_size_pretty(pg_total_relation_size('tablo_adı'));

 

Postgis geçersiz geometriler ve Arcgis Drawing Error hatası

11 Oca

PostgreSQL veritabanı ile konumsal(spatial) verilerin yönetilebilmesini sağlayan Postgis eklentisi, geometrik nesneler üzerinde işlemler yapılabilmesini sağlayan bir çok hazır fonksiyon sunar. Bu fonksiyonların tam listesine buradan ulaşabilmek mümkündür.

Bu yazıya konu olan fonksiyon, oluşturulan geometrinin geçerli olup olmadığını bulmaya yarayan St_IsValid fonksiyonu olacaktır. Eğer geometri geçersiz ise PostgreSQL bize geometrinin neden geçersiz olduğuna dair bir de mesaj bildirimi sunacaktır. Geometrilerin geçerliliği ve basitliği konusunda OGC tarafından tanımlanan bilgilere buradan ulaşabilirsiniz.

OGC tarafından basit olarak tanımlanan geometri tipleri, kendini kesen veya kendine teğet olan anormal geometrik noktalara sahip olmayan geometrik şekillerdir.

Örneğin LINESTRING türünde basit ve geçerli bir geometri;

LINESTRING(0 0, 1 1)

Örneğin LINESTRING türünde basit olmayan ama geçerli bir geometri;

LINESTRING(0 0, 1 1, 0 0)

Bu geoemtrinin basit sınıfa girmemesinin sebebi kendini kesen bir noktaya (0 0) sahip olmasıdır.

Ancak öyle durumlar vardır ki, seçilen geometri geçersizdir. Örneğin;

LINESTRING(0 0)

Bu LINESTRING tipindeki geometri tek bir noktadan meydana gelmiştir. Oysa ki LINESTRING tipindeki geometriler en az iki noktadan meydana gelmek zorundadır.

Geçersiz bir geometriyi veri tabanında sorgulamak istediğimizde aşağıdaki gibi bir sonuç alınacaktır.

Geçerli bir geometri sorgusu için ise olumlu bir sonuç alınacaktır.

NOT:

ArcGIS desktop uygulamalarından ArcMap ile çalışırken, geçersiz geometri içeren tablolar görüntülenmek istendiğinde, uygulama “Arcgis Drawing Error” başlıklı bir uyarı mesajı vermektedir. Arcgis geçersiz geoemtriyi çizdiremediği için bu mesajı vermektedir.

Bu hatayı ortadan kaldırabilmek için geçersiz geometrileri SQL query yardımıyla seçerek sistemden silmek gerekmektedir.

Postgresql Yedek Alma İşlemleri

10 Kas

PostgreSQL veri tabanı yedekleme işlemleri iki farklı adımda ele alınabilir. Bunu yanında tüm veri tabanını başka yere aktarmak yerine belli bir tablonun aktarılması da mümkündür.

  1. Veri tabanı yedeklerinin dosyaya aktarılması.
  2. Veri tabanı yedeklerinin başka bir veri tabanına aktarılması.
  3. Veri tabanında bulunan bir tablonun başka bir veri tabanına tabloya aktarılması.

PostgreSQL veri tabanında yedekleme işlemi için kullanılan komut pg_dump şeklindedir. 9.3 versiyonu için parametre ve kullanım seçeneklerine buradan erişebilirsiniz.

1- Veri tabanı yedeklerinin dosyaya aktarılması işlemi.

Dosyaya aktarım işlemleri sırasında Schema ve Data aktarımlarının ayrı ayrı veya birlikte aktarımı senaryoları vardır. Bu durumda üç durum söz konusudur.

a) Data ve Schema’nın birlikte dosyaya aktarılması.

pg_dump -C -h host -U username db_name > /directory/dump_schema_and_data_file_name

b) Sadece Data aktarılması.

pg_dump -Cs -h host -U username db_name > /any_directory/dump_schema_file_name

c) Sadece Schema aktarılması.

pg_dump -a -h host -U username db_name > /any_directory/dump_data_file_name

2- Veri tabanı yedeklerinin başka bir veri tabanına aktarılması işlemi.

PostgreSQL veri tabanında bulunan verileri başka bir sunucuda veya aynı sunucuda bulunan bir veri tabanına aktarmak mümkündür. Bu sayede herhangi bir dosya da yedekleme tutulmaz

Kopyalamanın uzak bilgisayardan (remote) çalıştığımız local bilgisayara yapılacağını varsayacak olursak.

pg_dump -C -h remote_host -U remote_user db_name | psql -h localhost -U local_user db_name

3-Veri tabanında bulunan bir tablonun başka bir veri tabanına tabloya aktarılması.

Kopyalamanın uzak bilgisayardan (remote) çalıştığımız bilgisayara yapılacağını varsayacak olursak.

pg_dump -t kopyalanacak_tablo_adı -U remote_username -h remote_host_adres remote_database_name | psql -U local_username local_database_name

Bu yedekleme işleminde remote_host_adres bilgisayarında bulunan remote_database_name veri tabanındaki tablo local bilgisayarda bulunan PosqreSQL veri tabanında bulunan local_database_name veri tabanına aktarılmıştır.

Postgresql Şifre Yenileme

9 Kas

PostgreSQL veri tabanında şifre unutma durumunda yapılacak işlem adımları.

Postgreql şifresini unuttuğumuzda değiştirmek için izlenecek adımlar.

  • Postgresql ayar dosyası olan pg_sql.hba içerisinde “md5” olan bütün kısımlar “trust” olarak değiştirilir. (host   all   all   0.0.0.0/0   trust ) gibi.
  • Postgresql servisi yeniden başlatılır.
  • Console veya PgAdmin penceresinden giriş yapılır. (PgAdmin ile girişte şifre sorarsa boş geçilir.)
  • Şifre değiştirme işlemi Console ve PgAdmin arayüzünden olmak üzere iki farklı şekilde yapılabilir.

1- Console ortamından şifre değişikliği.

postgresql

2- PgAdmin arayüzünden şifre değişikliği.

adsiz

Bu işlemlerin ardından yapılacak olan iki önemli adım vardır.

  • Postgresql ayar dosyası olan pg_sql.hba içerisinde “trust” olan bütün kısımlar “md5” olarak değiştirilir.
  • Postgresql servisi yeniden başlatılır.

EntityFramework 6 ve Postgresql Kullanımı

6 Şub

PostgreSQL veritabanına .NET tarafından erişebilmek için Npgsql adında bir provider geliştirilmiştir. Bu provider aracılığı ile veri tabanına sorgular atmak mümkündür.

Ancak günümüzde ORM araçlarının yaygınlaşmasıyla birlikte provider kullanarak veri tabanına erişim yerine ORM araçları tercih edilmektedir. Microsoft .NET tarafında kullanılan ORM aracı Entity Framework‘tür.

Entity Framework kullanarak PostgreSQL veritabanına erişmek için Npgsql paketlerini Nuget üzerinden indirmek gerekmektedir. İndirme işlemi için aşağıdaki komutlar bize yardımcı olacaktır.

Install-Package EntityFramework
Install-Package Npgsql.EntityFramework

Şu anda EntityFramework 6 sürümü piyasaya sürülmüş durumdadır. Bunu da bir not olarak belirtmekte fayda var.

EF ve Npgsql
Entity Framework ve Npgsql

App.config veya Web.config dosyalarında gerekli ayarlamaların yapılması gerekmektedir.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
      <section name="entityFramework"
               type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
               requirePermission="false" />
    </configSections>
    <connectionStrings>
       <add name="ChinookContext"
            connectionString="Server=10.0.1.7;Database=deneme;User Id=denuser;Password=denpass;"
            providerName="Npgsql" />
     <providers>
       <provider
        invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
       <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql" />
     </providers>
   </connectionStrings>
   <entityFramework>
     <defaultConnectionFactory
        type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
     <providers>
          <provider
              invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
          <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
     </providers>
   </entityFramework>
   <system.data>
     <DbProviderFactories>
        <add name="Npgsql Data Provider"
          invariant="Npgsql"
          support="FF"
          description="Data Provider for PostgreSQL"
          type="Npgsql.NpgsqlFactory, Npgsql" />
        </DbProviderFactories>
    </system.data>
    <runtime>
       <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
       <assemblyIdentity name="Npgsql" publicKeyToken="5d8b90d52f46fda7" culture="neutral" />
       <bindingRedirect oldVersion="0.0.0.0-2.0.14.3" newVersion="2.0.14.3" />
       </dependentAssembly>
       </assemblyBinding>
   </runtime>
</configuration>

Geri kalan işlem klasik Code First yaklaşımının uygulanışı şeklindedir. Öncelikle tablolarımızı temsil eden sınıfları oluşturmalıyız. Bu örnekte Book ve Author sınıfları oluşturulmuştur.

  public class Book
  {
      public string Name { get; set; }
      public virtual Author Author { get; set; }
  }

  public class Author
  {
      public string Name { get; set; }
      public virtual ICollection<Book> Books { get; set; }
  }

Daha sonra Entity Framework için gerekli olan DbContext oluşturmak gerekir.

  public class ChinookContext : DbContext
  {
      public DbSet<Book> Books { get; set; }
      public DbSet<Book> Authors { get; set; }

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
           modelBuilder.Entity<Book>().ToTable("Book", "public");
           modelBuilder.Entity<Author>().ToTable("Author", "public");

          modelBuilder.Conventions.Remove<StoreGeneratedIdentityKeyConvention>();
      }
 }

DbContext sınıfında DbModelBuilder nesnesinin Entity özelliğinde tabloların hangi  şemaya ait olduğunu belirtmemiz gerekmektedir. Aksi taktirde provider, varsayılan olarak “dbo” şemasını arayacaktır. Bu durum bize Exception olarak geri dönebilir.

Bir sonraki yazıda görüşmek dileğiyle.