Lua - Veritabanı Erişimi

Basit veri işlemleri için dosyaları kullanabiliriz, ancak bazen bu dosya işlemleri verimli, ölçeklenebilir ve güçlü olmayabilir. Bu amaçla, sıklıkla veritabanlarını kullanmaya geçebiliriz. LuaSQL, Lua'dan bir dizi veritabanı yönetim sistemine basit bir arayüzdür. LuaSQL, farklı SQL türleri için destek sağlayan kitaplıktır. Bu,

  • SQLite
  • Mysql
  • ODBC

Bu eğitimde, Lua'da MySQL ve SQLite'nin veritabanı işlemesini ele alacağız. Bu, her ikisi için de genel bir arabirim kullanır ve bu uygulamayı diğer veri tabanı türlerine de taşımak mümkün olmalıdır. Öncelikle MySQL'de işlemleri nasıl yapabileceğinizi görelim.

MySQL db Kurulumu

Aşağıdaki örnekleri beklendiği gibi kullanmak için ilk db kurulumuna ihtiyacımız var. Varsayımlar aşağıda listelenmiştir.

  • MySQL'i varsayılan kullanıcı olarak root ve şifre '123456' ile kurup kurdunuz.

  • Bir veritabanı testi oluşturdunuz.

  • MySQL Temellerini anlamak için MySQL eğitiminden geçtiniz.

MySQL içe aktarılıyor

Basit kullanabiliriz require Lua uygulamanızın doğru şekilde yapıldığını varsayarak sqlite kitaplığını içe aktarma ifadesi.

mysql = require "luasql.mysql"

Mysql değişkeni, ana mysql tablosuna başvurarak işlevlere erişim sağlayacaktır.

Bağlantı Kurma

Bir MySQL ortamı başlatarak ve ardından ortam için bir bağlantı oluşturarak bağlantıyı kurabiliriz. Aşağıda gösterilmiştir.

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')

Yukarıdaki bağlantı, mevcut bir MySQL dosyasına bağlanacak ve yeni oluşturulan dosyayla bağlantı kuracaktır.

İşlevi Yürüt

Oluşturma, ekleme, silme, güncelleme ve benzeri tüm db işlemlerini yapmamıza yardımcı olacak bağlantıyla birlikte kullanılabilen basit bir yürütme işlevi vardır. Sözdizimi aşağıda gösterilmiştir -

conn:execute([[ 'MySQLSTATEMENT' ]])

Yukarıdaki sözdiziminde, connect'in açık ve mevcut MySQL bağlantısının olduğundan emin olmamız ve 'MySQLSTATEMENT'i doğru ifadeyle değiştirmemiz gerekir.

Tablo Örneği Oluştur

Aşağıda basit bir tablo oluşturma örneği gösterilmektedir. Tamsayı türünde iki parametre kimliği ve varchar türünde adı olan bir tablo oluşturur.

mysql = require "luasql.mysql"

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')

print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample2 (id INTEGER, name TEXT);]])
print(status,errorString )

Yukarıdaki programı çalıştırdığınızda id ve name olmak üzere iki sütun içeren sample adında bir tablo oluşturulacaktır.

MySQL environment (004BB178)	MySQL connection (004BE3C8)
0	nil

Herhangi bir hata olması durumunda, sıfır yerine bir hata ifadesi döndürülür. Aşağıda basit bir hata ifadesi gösterilmektedir.

LuaSQL: Error executing query. MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"id INTEGER, name TEXT)' at line 1

İfade Örneği Ekle

MySQL için bir ekleme ifadesi aşağıda gösterilmektedir.

conn:execute([[INSERT INTO sample values('11','Raj')]])

Güncelleme İfadesi Örneği

MySQL için bir güncelleme bildirimi aşağıda gösterilmektedir.

conn:execute([[UPDATE sample3 SET name='John' where id ='12']])

İfade Örneği Sil

MySQL için bir silme ifadesi aşağıda gösterilmiştir.

conn:execute([[DELETE from sample3 where id ='12']])

İfade Örneği Seçin

Select ifadesi söz konusu olduğunda, satırların her birinde döngü yapmamız ve gerekli verileri çıkarmamız gerekir. Basit bir seçme ifadesi aşağıda gösterilmiştir.

cursor,errorString = conn:execute([[select * from sample]])
row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   -- reusing the table of results
   row = cursor:fetch (row, "a")
end

Yukarıdaki kodda, conn açık bir MySQL bağlantısıdır. Execute deyimi tarafından döndürülen imlecin yardımıyla, tablo yanıtında döngü oluşturabilir ve gerekli seçme verilerini alabilirsiniz.

Tam Bir Örnek

Yukarıdaki tüm ifadeleri içeren eksiksiz bir örnek aşağıda verilmiştir.

mysql = require "luasql.mysql"

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample3 (id INTEGER, name TEXT)]])
print(status,errorString )

status,errorString = conn:execute([[INSERT INTO sample3 values('12','Raj')]])
print(status,errorString )

cursor,errorString = conn:execute([[select * from sample3]])
print(cursor,errorString)

row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   row = cursor:fetch (row, "a")
end

-- close everything
cursor:close()
conn:close()
env:close()

Yukarıdaki programı çalıştırdığınızda, aşağıdaki çıktıyı alacaksınız.

MySQL environment (0037B178)	MySQL connection (0037EBA8)
0	nil
1	nil
MySQL cursor (003778A8)	nil
Id: 12, Name: Raj

İşlemlerin Gerçekleştirilmesi

İşlemler, veri tutarlılığını sağlayan bir mekanizmadır. İşlemler aşağıdaki dört özelliğe sahip olmalıdır -

  • Atomicity - Ya bir işlem tamamlanır ya da hiçbir şey olmaz.

  • Consistency - Bir işlem tutarlı bir durumda başlamalı ve sistemi tutarlı bir durumda bırakmalıdır.

  • Isolation - Bir işlemin ara sonuçları cari işlemin dışında görünmez.

  • Durability - Bir işlem yapıldığında, sistem hatasından sonra bile etkiler kalıcıdır.

İşlem START TRANSACTION ile başlar; ve commit veya rollback ifadesiyle biter.

İşlemi Başlat

Bir işlemi başlatmak için, conn'in açık bir MySQL bağlantısı olduğunu varsayarak, Lua'da aşağıdaki ifadeyi yürütmemiz gerekir.

conn:execute([[START TRANSACTION;]])

Geri Alma İşlemi

İşlem başlatıldıktan sonra yapılan değişiklikleri geri almak için aşağıdaki ifadeyi yürütmemiz gerekir.

conn:execute([[ROLLBACK;]])

İşlemi Tamamla

İşlem başlatıldıktan sonra yapılan değişiklikleri kaydetmek için aşağıdaki ifadeyi yürütmemiz gerekir.

conn:execute([[COMMIT;]])

Yukarıdaki bölümde MySQL hakkında bilgi sahibiyiz ve aşağıdaki bölümde temel SQL işlemleri anlatılmaktadır. İşlemleri hatırlayın, ancak SQLite3 için tekrar açıklanmasa da aynı ifadeler SQLite3 için de çalışmalıdır.

SQLite içe aktarılıyor

Lua uygulamanızın doğru şekilde yapıldığını varsayarak SQLite kitaplığını içe aktarmak için basit bir require ifadesi kullanabiliriz. Yükleme sırasında, veritabanıyla ilgili dosyaları içeren bir klasör libsql.

sqlite3 = require "luasql.sqlite3"

Sqlite3 değişkeni, ana sqlite3 tablosuna başvurarak fonksiyonlara erişim sağlayacaktır.

Bağlantı Kurma

Bir SQLite ortamı başlatarak ve daha sonra ortam için bir bağlantı oluşturarak bağlantıyı kurabiliriz. Aşağıda gösterilmiştir.

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')

Yukarıdaki bağlantı, mevcut bir SQLite dosyasına bağlanır veya yeni bir SQLite dosyası oluşturur ve yeni oluşturulan dosyayla bağlantı kurar.

İşlevi Yürüt

Oluşturma, ekleme, silme, güncelleme ve benzeri tüm db işlemlerini yapmamıza yardımcı olacak bağlantıyla birlikte kullanılabilen basit bir yürütme işlevi vardır. Sözdizimi aşağıda gösterilmiştir -

conn:execute([[ 'SQLite3STATEMENT' ]])

Yukarıdaki sözdiziminde, conn'in açık ve mevcut sqlite3 bağlantısının olduğundan emin olmamız ve 'SQLite3STATEMENT'i doğru ifadeyle değiştirmemiz gerekiyor.

Tablo Örneği Oluştur

Aşağıda basit bir tablo oluşturma örneği gösterilmektedir. Tamsayı türünde iki parametre kimliği ve varchar türünde adı olan bir tablo oluşturur.

sqlite3 = require "luasql.sqlite3"

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample ('id' INTEGER, 'name' TEXT)]])
print(status,errorString )

Yukarıdaki programı çalıştırdığınızda id ve name olmak üzere iki sütun içeren sample adında bir tablo oluşturulacaktır.

SQLite3 environment (003EC918)	SQLite3 connection (00421F08)
0	nil

Bir hata durumunda, sıfır yerine bir hata ifadesi döndürülür. Aşağıda basit bir hata ifadesi gösterilmektedir.

LuaSQL: unrecognized token: ""'id' INTEGER, 'name' TEXT)"

İfade Örneği Ekle

Aşağıda SQLite için bir ekleme ifadesi gösterilmektedir.

conn:execute([[INSERT INTO sample values('11','Raj')]])

İfade Örneği Seçin

Select ifadesi söz konusu olduğunda, satırların her birinde döngü yapmamız ve gerekli verileri çıkarmamız gerekir. Basit bir seçme ifadesi aşağıda gösterilmiştir.

cursor,errorString = conn:execute([[select * from sample]])
row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   -- reusing the table of results
   row = cursor:fetch (row, "a")
end

Yukarıdaki kodda, conn açık bir sqlite3 bağlantısıdır. Execute deyimi tarafından döndürülen imlecin yardımıyla, tablo yanıtında döngü oluşturabilir ve gerekli seçme verilerini alabilirsiniz.

Tam Bir Örnek

Yukarıdaki tüm ifadeleri içeren eksiksiz bir örnek aşağıda verilmiştir.

sqlite3 = require "luasql.sqlite3"

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample ('id' INTEGER, 'name' TEXT)]])
print(status,errorString )

status,errorString = conn:execute([[INSERT INTO sample values('1','Raj')]])
print(status,errorString )

cursor,errorString = conn:execute([[select * from sample]])
print(cursor,errorString)

row = cursor:fetch ({}, "a")

while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name))
   row = cursor:fetch (row, "a")
end

-- close everything
cursor:close()
conn:close()
env:close()

Yukarıdaki programı çalıştırdığınızda, aşağıdaki çıktıyı alacaksınız.

SQLite3 environment (005EC918)	SQLite3 connection (005E77B0)
0	nil
1	nil
SQLite3 cursor (005E9200)	nil
Id: 1, Name: Raj

Mevcut tüm sorguları bu libsql kütüphanesi yardımıyla yürütebiliriz. Bu yüzden lütfen bu örneklerle yetinmeyin. İlgili MySQL, SQLite3 ve Lua'da desteklenen diğer veritabanlarında bulunan çeşitli sorgu ifadelerini deneyin.