Eh, böyle bir tartışmamız olduğunda yapılması gereken önemli bir şey, nesne ilişkisel eşleştiricileri ("ORM") ve veritabanı soyutlama katmanlarını açıkça ayırt etmektir . Bir ORM bir tür veritabanı soyutlama katmanıdır, ancak tüm veritabanı soyutlama katmanları ORM değildir. Bunu kavramak için çalışılacak iyi bir araç, Python'un kendisini " farklı şeyler olduğu fikriyle " SQL araç seti ve Nesne İlişkisel Eşleştiricisi "(kalın yazı tipim) olarak alan popüler SQLAlchemy kütüphanesidir . Temel özellikler sayfasına koydukları gibi :
ORM Gerekmiyor
SQLAlchemy, Core ve ORM olarak bilinen iki ayrı bileşenden oluşur . Çekirdek, tam kapsamlı bir SQL soyutlama araç setidir ve çok çeşitli DBAPI uygulamaları ve davranışları üzerinde düzgün bir soyutlama katmanı ve ayrıca üretken Python ifadeleriyle SQL dilinin ifadesini sağlayan bir SQL İfade Dili sunar. Hem DDL deyimlerini yayan hem de mevcut şemaları inceleyen bir şema gösterme sistemi ve Python türlerinin veritabanı türleriyle eşlenmesini sağlayan bir tür sistemi sistemi yuvarlar. Nesne İlişkisel Eşleştiricisi, daha sonra Çekirdeğe dayanan isteğe bağlı bir pakettir.
Ön sayfa ORM'yi şöyle açıklar:
SQLAlchemy, sınıfların veri tabanına açık uçlu olarak eşlenebileceği, veri modelleme düzenini sağlayan isteğe bağlı bir bileşen olan nesne-ilişkisel eşleştiricisi (ORM) ile ünlüdür; nesne modeli ve veritabanı şemasının bir Baştan beri temiz bir şekilde ayrışmış bir yol.
Bir ORM'nin ana fikri, ünlü nesne-ilişkisel empedans uyumsuzluğunu denemek ve köprü yapmaktır . Bu, kullanıcı tanımlı sınıflar arasında bir veritabanı şemasındaki tablolarla ilişkileri tanımlamak ve uygulamanızın sınıfları için otomatik "kaydet" ve "yükleme" işlemleri sağlamak anlamına gelir.
Buna karşılık, ORM dışı veritabanı soyutlama katmanları, ilişkisel veri modeline ve SQL'e daha fazla bağlı olma eğilimindedir ve hiçbir şekilde nesne yönelimli değildir. Bu nedenle, tablolar ve sınıflar arasında "eşlemeler" kullanmak ve veritabanı şemasını programlayıcıdan gizlemek yerine, veritabanını programlayıcıya gösterme eğilimindedirler, ancak daha iyi API'ler ve soyutlamalar yaparlar. Örneğin, SQL sorgu oluşturucuları, programatik olarak, dize manipülasyonu olmadan karmaşık Java sorguları oluşturmanıza olanak tanır ( bunun için Java için jOOQ kitaplığından bir örnek ):
// Typesafely execute the SQL statement directly with jOOQ
Result<Record3<String, String, String>> result =
create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.from(BOOK)
.join(AUTHOR)
.on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
.where(BOOK.PUBLISHED_IN.equal(1948))
.fetch();
Şimdi, Oyun çerçevesi, az önce tarif ettiğim ile ligde% 100 gibi görünmüyor , ancak argümanları bu genel alanda gözüküyor: doğrudan sınıflara çevirmek ve onlardan geri dönmek yerine ilişkisel modelle çalışın.
JOOQ kütüphane ORMs karşı bir konum olarak okuyan değer. Ayrıca okunmaya değer bazı alakalı blog girişleri de vardır: