Yuk, mulai berbagi lagi. Setelah 3 tahunan tidak ada update di blog ini, saya kembali. Kali ini mau mencoba menjelaskan tentang cara mengakses database dengan python.
Waktu kita mengolah data, data tidak selalu tersimpan dalam bentuk file csv. Bisa saja (bahkan lebih sering) data tersebut sudah tersimpan dengan baik di database. Terus gimana ngambilnya? Apakah bikin query di sql dulu habis itu didump ke csv, terus dibuka lagi di python? Tentu tidak ya. Ada cara yang lebih mudah dengan memanfaatkan sqlalchemy.
Saya akan tunjukkan caranya dengan jupyter notebook.
Pertama-tama, pastikan dulu bahwa modul tersebut sudah terinstall.
!pip install sqlalchemy
Setelah itu import fungsi create_engine. Fungsi ini berguna untuk menghubungkan database API dengan aplikasi yang kita gunakan melalui pool koneksi dan dialek.
from sqlalchemy import create_engine
Database apa saja yang bisa diakses? Dari mysql, postgresql, sqlite, sampai microsoft sql server dan oracle bisa. Kita buat dulu url_objectnya (bisa diskip jika databasenya tersimpan lokal dan tidak dipassword).
from sqlalchemy import URL
url_object = URL.create(
"postgresql+pg8000",
username="dbuser",
password="kx@jj5/g",
host="pghost10",
database="appdb",
)
engine = create_engine(url_object)
Dalam contoh di atas, postgresql dan pg8000 adalah drivernya. Selain drivername, kita bisa memasukkan username, password, host, port, database, dan juga query untuk konek ke DBAPI-nya. Jangan lupa bahwa password dituliskan secara plain (tanpa menggunakan escape characters).
Kalau pakai sqlite gimana? langsung saja url_objectnya kita buat sebagai argumen di fungsinya dalam bentuk string dengan format <driver=sqlite>:///<path ke database> . Di sini slashnya ada 3 karena relative file path.
# Unix/Mac - 4 slash di awal
engine = create_engine("sqlite:////absolute/path/to/foo.db")
# Windows
engine = create_engine("sqlite:///C:\\path\\to\\foo.db")
# atau alternatifnya menggunakan raw string di Windows
engine = create_engine(r"sqlite:///C:\path\to\foo.db")
Sudah, sekarang kita sudah punya enginenya untuk berinteraksi dengan database. Apa saja yang bisa kita lakukan? Beberapa diantaranya adalah :
- Query
- Melihat tabel-tabel yang ada
- Melihat kolom-kolom pada tabel tertentu
- dll
Yang paling dasar yaitu query. Simpelnya adalah kita menyuruh enginenya untuk mengeksekusi query sql yang kita berikan.
query = "select * from saham where kode_saham=PTBA;"
engine.execute(query)
Fungsi execute akan mengembalikan cursor object result. Bagaimana caranya agar bisa kita lihat? bisa kita masukkan ke dalam dataframe langsung hasil tersebut.
import pandas as pd
query = "select * from saham where kode_saham=PTBA;"
df = pd.DataFrame(engine.execute(query))
Sebenarnya kita bisa menggunakan query sql untuk poin nomor 2 dan seterusnya, tetapi di sini saya berikan alternatifnya jika mengakses menggunakan sqlalchemy.
# untuk melihat daftar tabel
engine.table_names()
# atau menggunakan inspector
from sqlalchemy import inspect
inspect(engine).get_table_names()
Untuk mendapatkan nama kolom pada tabel tertentu kita bisa memanfaatkan kunci dari cursor object resultnya atau membaca metadata dari tabelnya langsung.
# menggunakan query sqlite
query = "pragma table_info(saham);"
list(engine.execute(query))
# menggunakan kunci dari cursor object
query = "select * from saham;"
engine.execute(query).keys()
# membaca metadata tabel
query = "select * from saham;"
engine.execute(query)._metadata.keys
Semoga bermanfaat.