Firebird Web Query Plus: Flask ile Veritabanı Yönetim Uygulaması Geliştirme
Firebird Web Query Plus: Flask ile Veritabanı Yönetim Uygulaması Geliştirme
Giriş
Merhaba! Bu blog yazısında, Firebird veritabanı ile etkileşimli bir web uygulaması geliştirme sürecini adım adım anlatacağım. Bu uygulama, özellikle tahsilat işlemleri için optimize edilmiş ve modern web teknolojileri kullanılarak geliştirilmiştir. Hadi başlayalım!
1. Proje Yapısı ve Temel Kurulum
1.1 Proje Yapısı
Öncelikle, projemizin dosya yapısını oluşturalım. Aşağıdaki gibi bir yapı kullanacağız:
firebird_web_query_plus/
│
├── app.py
├── add_queries.py
├── templates/
│ └── tahsilat_gir.html
├── static/
│ └── css/
│ └── js/
├── queries.db
└── databases.db
1.2 Gerekli Kütüphanelerin Kurulumu
Flask uygulamamızı geliştirmek için bazı Python kütüphanelerine ihtiyacımız var. Bunları kurmak için terminalde aşağıdaki komutu çalıştırabilirsiniz:
pip install flask flask-cors fdb
2. Veritabanı Şema Oluşturma
Uygulamamız için gerekli veritabanı tablolarını oluşturalım. Bu tablolar, sorgularımızı ve sorgu geçmişimizi saklayacak.
import sqlite3
import os
DB_PATH = 'queries.db'
if not os.path.exists(DB_PATH):
conn = sqlite3.connect(DB_PATH)
cur = conn.cursor()
cur.execute('''CREATE TABLE queries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
query TEXT,
type TEXT,
database_id INTEGER
)''')
cur.execute('''CREATE TABLE query_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
query_id INTEGER,
execution_time TIMESTAMP,
parameters TEXT,
execution_duration REAL,
status TEXT,
result_count INTEGER,
FOREIGN KEY (query_id) REFERENCES queries (id)
)''')
conn.commit()
conn.close()
3. Tahsilat Modülü için Sorgu Yönetimi
Tahsilat formu için gerekli sorguları veritabanına ekleyelim. Bu sorgular, cari kartlar, kasalar, personeller ve işlem noktaları için veri çekecek.
import sqlite3
def add_queries():
conn = sqlite3.connect('queries.db')
cur = conn.cursor()
# Cari kartları sorgusu
cur.execute('''
INSERT INTO queries (name, query, type, database_id)
VALUES (
'cari_kartlar',
'SELECT FIRST 10 CARI_NO, CARI_UNVANI FROM CARIKART
WHERE CARI_UNVANI CONTAINING ? ORDER BY CARI_UNVANI',
'SELECT',
1
)
''')
# Diğer sorgular...
conn.commit()
conn.close()
if __name__ == "__main__":
add_queries()
Bu scripti çalıştırarak sorguları veritabanına ekleyebilirsiniz:
python add_queries.py
4. API Endpoint’lerinin Oluşturulması
Tahsilat formu için gerekli API endpoint’lerini oluşturalım. Bu endpoint’ler, kullanıcıdan gelen istekleri alacak ve veritabanından veri çekecek.
from flask import Flask, request, jsonify
import sqlite3
app = Flask(__name__)
@app.route('/api/cari-kartlar')
def get_cari_kartlar():
try:
conn = sqlite3.connect(DB_PATH)
cur = conn.cursor()
cur.execute("SELECT id FROM queries WHERE name = 'cari_kartlar'")
query_id = cur.fetchone()[0]
conn.close()
search_term = request.args.get('q', '')
params = {'q': search_term}
return dynamic_api('cari_kartlar', query_id, params)
except Exception as e:
return jsonify({"success": False, "error": str(e)})
# Diğer endpoint'ler...
5. Frontend Geliştirme
Tahsilat formu için HTML template oluşturalım. Bu form, kullanıcıdan tahsilat bilgilerini alacak ve API’ye gönderecek.
<!DOCTYPE html>
<html>
<head>
<title>Tahsilat Girişi</title>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<form id="tahsilatForm">
<div class="mb-3">
<label>Cari Hesap</label>
<select class="form-control select2" name="cari_id" required>
<option value="">Seçiniz...</option>
</select>
</div>
<!-- Diğer form alanları -->
</form>
</div>
</body>
</html>
6. Select2 Entegrasyonu
Form alanları için Select2 entegrasyonunu yapalım. Select2, kullanıcıya daha iyi bir arama ve seçim deneyimi sunar.
$(document).ready(function() {
$('.select2').select2({
theme: 'bootstrap-5',
minimumInputLength: 2,
language: {
inputTooShort: function() {
return 'En az 2 karakter giriniz...';
},
noResults: function() {
return 'Sonuç bulunamadı';
},
searching: function() {
return 'Aranıyor...';
}
},
ajax: {
url: '/api/cari-kartlar',
dataType: 'json',
delay: 250,
data: function(params) {
return {
q: params.term
};
},
processResults: function(data) {
return {
results: data.data.map(function(item) {
return {
id: item.CARI_NO,
text: item.CARI_UNVANI
};
})
};
},
cache: true
}
});
});
7. Tahsilat Kaydetme İşlemi
Tahsilat kaydını veritabanına ekleyelim. Bu işlem, kullanıcıdan alınan bilgileri kullanarak veritabanına yeni bir kayıt ekler.
@app.route('/api/cari-islem-giris', methods=['POST'])
def cari_islem_giris():
try:
data = request.get_json()
db_config = get_database_config(1)
conn = fdb.connect(**db_config)
cur = conn.cursor()
params = {
'ACIKLAMA': data.get('aciklama'),
'TARIH': data.get('basket_datetime'),
'TUTAR': data.get('hk_islem_tutari'),
'KASA_ID': data.get('kasa_id'),
'CARI_NO': data.get('hk_cari_id'),
'PERSONEL_ID': data.get('personel_id'),
'ISLEM_NOKTASI_ID': data.get('islem_noktasi_id')
}
cur.execute('''
INSERT INTO CARIISLEM_GIRIS (
ISLEM_KODU, ACIKLAMA, TARIH, VADE_TARIHI,
DOVIZ_BIRIMI, DOVIZ_KURU, ALACAK,
KASA_HESAP_NO, CARI_NO, PERSONEL_NO,
ISLEM_NOKTASI_NO
) VALUES (
'NAKTAH', :ACIKLAMA, :TARIH, :VADE_TARIHI,
'TL', 1, :TUTAR, :KASA_ID, :CARI_NO,
:PERSONEL_ID, :ISLEM_NOKTASI_ID
)
''', params)
conn.commit()
return jsonify({"success": True, "message": "Tahsilat kaydedildi"})
except Exception as e:
return jsonify({"success": False, "error": str(e)})
8. Güvenlik ve Hata Yönetimi
Uygulamamızda güvenlik ve hata yönetimi için gerekli önlemleri alalım. Bu, uygulamanın daha güvenli ve kararlı çalışmasını sağlar.
def log_yaz(mesaj, seviye="info"):
if seviye == "error":
logging.error(mesaj)
else:
logging.info(mesaj)
def format_value(value):
if value is None:
return None
elif isinstance(value, (bytes, bytearray)):
return value.decode('utf-8', errors='ignore')
elif isinstance(value, datetime):
return value.strftime("%d.%m.%Y %H:%M:%S")
else:
return str(value).strip()
9. Uygulama Çalıştırma
Son olarak, uygulamayı çalıştıralım. Bu, uygulamanın yerel sunucuda çalışmasını sağlar ve tarayıcıdan erişilebilir hale getirir.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
Sonuç
Bu blog yazısında, Firebird veritabanı ile çalışan bir web uygulaması geliştirme sürecini adım adım anlattık. Uygulama:
- Modern web teknolojileri kullanıyor
- Güvenli veritabanı işlemleri yapıyor
- Kullanıcı dostu bir arayüz sunuyor
- Genişletilebilir bir yapıya sahip
Projeyi geliştirmeye devam etmek için şu adımlar önerilebilir:
- Kullanıcı yetkilendirme sistemi eklemek
- Daha fazla raporlama özelliği eklemek
- Batch işlem desteği eklemek
- Performans optimizasyonları yapmak
Bu proje, Firebird veritabanı ile çalışan işletmeler için güçlü bir veri yönetim aracı olarak kullanılabilir. Umarım bu yazı, kendi projelerinizi geliştirirken size ilham verir ve yardımcı olur!