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.