Dokumentasi ini menyediakan panduan tentang cara mengimplementasikan UUID (Universally Unique Identifier) dalam model SQLAlchemy untuk database SQLite dan PostgreSQL. UUID umumnya digunakan sebagai pengidentifikasi unik untuk catatan dalam database karena keunikannya di berbagai sistem dan waktu.
1. Pengenalan UUID
- UUID (Universally Unique Identifier) adalah nomor 128-bit yang digunakan untuk mengidentifikasi informasi secara unik di sistem komputer.
- Dalam database, UUID digunakan sebagai primary key untuk memastikan keunikan di sistem terdistribusi.
- UUID direpresentasikan sebagai string dengan format standar:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
, di manaM
danN
adalah bit khusus yang menunjukkan versi dan varian UUID.
2. Menggunakan UUID dengan SQLAlchemy
SQLAlchemy mendukung UUID, tetapi implementasinya sedikit berbeda tergantung pada database yang digunakan (misalnya, SQLite atau PostgreSQL).
2.1 Menggunakan UUID di SQLite
SQLite tidak memiliki dukungan native untuk UUID sebagai tipe data, sehingga kita menggunakan String
untuk menyimpan UUID.
Contoh Model Menggunakan UUID di SQLite
import uuid
from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class DeviceManager(Base):
__tablename__ = 'device_manager'
# Menggunakan String untuk menyimpan UUID, dengan panjang maksimum 36 karakter
id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
device_name = Column(String(255), nullable=False)
ip_address = Column(String(255), nullable=False)
vendor = Column(String(255), nullable=False)
description = Column(String(255))
created_by = Column(String(255), nullable=False)
user_id = Column(String(36), nullable=False)
def __repr__(self):
return f"<DeviceManager {self.device_name} ({self.ip_address})>"
- Generasi UUID: Parameter
default
menggunakan fungsi lambda untuk menghasilkan string UUID baru menggunakan metodeuuid.uuid4()
dari Python. - Penyimpanan: UUID disimpan sebagai
String
dengan panjang 36 karakter, yang cukup untuk menyimpan format UUID standar.
2.2 Menggunakan UUID di PostgreSQL
PostgreSQL memiliki dukungan native untuk UUID menggunakan tipe data UUID
, yang sangat efisien untuk penyimpanan dan pengambilan.
Contoh Model Menggunakan UUID di PostgreSQL
import uuid
from sqlalchemy import Column, String
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class DeviceManager(Base):
__tablename__ = 'device_manager'
# Menggunakan tipe UUID native dari PostgreSQL
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
device_name = Column(String(255), nullable=False)
ip_address = Column(String(255), nullable=False)
vendor = Column(String(255), nullable=False)
description = Column(String(255))
created_by = Column(String(255), nullable=False)
user_id = Column(UUID(as_uuid=True), nullable=False)
def __repr__(self):
return f"<DeviceManager {self.device_name} ({self.ip_address})>"
- Generasi UUID: Parameter
default
langsung menggunakanuuid.uuid4
, yang menghasilkan objek UUID. - Penyimpanan: Tipe
UUID(as_uuid=True)
memastikan bahwa UUID disimpan dan dikembalikan sebagai objek UUID, bukan string.
3. Beralih Antara SQLite dan PostgreSQL
Untuk menjaga fleksibilitas dalam beralih antara SQLite dan PostgreSQL, Anda dapat mengimplementasikan logika kondisional dalam model SQLAlchemy atau konfigurasi:
import uuid
from sqlalchemy import Column, String
from sqlalchemy.dialects.postgresql import UUID as PG_UUID
from sqlalchemy.ext.declarative import declarative_base
from flask import current_app
Base = declarative_base()
def get_uuid_type():
if current_app.config['SQLALCHEMY_DATABASE_URI'].startswith('postgresql'):
return PG_UUID(as_uuid=True) # Gunakan tipe UUID native untuk PostgreSQL
else:
return String(36) # Gunakan String untuk SQLite
class DeviceManager(Base):
__tablename__ = 'device_manager'
# Memilih tipe UUID secara dinamis berdasarkan database
id = Column(get_uuid_type(), primary_key=True, default=lambda: str(uuid.uuid4()))
device_name = Column(String(255), nullable=False)
ip_address = Column(String(255), nullable=False)
vendor = Column(String(255), nullable=False)
description = Column(String(255))
created_by = Column(String(255), nullable=False)
user_id = Column(get_uuid_type(), nullable=False)
def __repr__(self):
return f"<DeviceManager {self.device_name} ({self.ip_address})>"
4. Generasi dan Validasi UUID
- Generasi: Gunakan pustaka
uuid
dari Python untuk menghasilkan UUID. Fungsiuuid.uuid4()
menghasilkan UUID acak, yang cocok untuk sebagian besar kasus. - Validasi: UUID harus divalidasi untuk memastikan bahwa mereka sesuai dengan format standar. Kelas
uuid.UUID
dari Python dapat digunakan untuk memvalidasi string UUID.
Contoh Validasi UUID
import uuid
def is_valid_uuid(uuid_string):
try:
uuid_obj = uuid.UUID(uuid_string, version=4)
return str(uuid_obj) == uuid_string
except ValueError:
return False
5. Ringkasan
- SQLite: Gunakan
String(36)
untuk menyimpan UUID dan hasilkan denganuuid.uuid4()
. - PostgreSQL: Gunakan
UUID(as_uuid=True)
untuk dukungan UUID native. - Beralih Database: Gunakan logika kondisional dalam model untuk memilih tipe UUID yang sesuai berdasarkan database.
- Validasi: Validasi UUID untuk memastikan mereka sesuai dengan format yang diharapkan.
6. Best Practices
- Konsistensi: Pastikan UUID dihasilkan dan divalidasi secara konsisten di berbagai bagian aplikasi.
- Keamanan: UUID bersifat unik dan dapat mengekspos informasi tentang sistem internal. Pertimbangkan menggunakan langkah keamanan tambahan, seperti enkripsi, untuk informasi sensitif.
- Skalabilitas: Menggunakan UUID sebagai primary key dapat sedikit meningkatkan ukuran database, tetapi mereka menawarkan manfaat signifikan untuk skalabilitas, terutama di sistem terdistribusi.
Dokumentasi ini memberikan panduan komprehensif untuk mengimplementasikan UUID dalam model SQLAlchemy untuk SQLite dan PostgreSQL, memastikan bahwa aplikasi Anda tetap fleksibel, skalabel, dan mudah dikelola.