0% menganggap dokumen ini bermanfaat (0 suara)
36 tayangan42 halaman

Python Dan MySQL

Diunggah oleh

Agus Wira Permana
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai DOCX, PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
36 tayangan42 halaman

Python Dan MySQL

Diunggah oleh

Agus Wira Permana
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai DOCX, PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 42

Python dan Database MySQL: Pengenalan Praktis

oleh Chaitanya Baweja 28 Desember 2020 8 Komentar intermediat basis data ilmu data

Tandai sebagai SelesaiMembagikan

Daftar isi

 Membandingkan MySQL dengan Database SQL Lainnya


 Menginstal Server MySQL dan Konektor MySQL/Python
o Menginstal Server MySQL
o Memasang Konektor MySQL/Python
 Membuat Koneksi Dengan Server MySQL
o Membangun Koneksi
o Membuat Database Baru
o Menghubungkan ke Basis Data yang Ada
 Membuat, Mengubah, dan Menghapus Tabel
o Mendefinisikan Skema Basis Data
o Membuat Tabel Menggunakan Pernyataan CREATE TABLE
o Menampilkan Skema Tabel Menggunakan Pernyataan DESCRIBE
o Memodifikasi Skema Tabel Menggunakan Pernyataan ALTER
o Menghapus Tabel Menggunakan Pernyataan DROP
 Memasukkan Rekaman ke dalam Tabel
o Menggunakan .execute()
o Menggunakan .executemany()
 Membaca Catatan Dari Basis Data
o Membaca Catatan Menggunakan Pernyataan SELECT
o Memfilter Hasil Menggunakan Klausa WHERE
 Menangani Beberapa Tabel Menggunakan Pernyataan JOIN
 Memperbarui dan Menghapus Catatan Dari Basis Data
o Perintah UPDATE
o Perintah DELETE
 Cara Lain untuk Menghubungkan Python dan MySQL
 Kesimpulan

Hapus iklan

MySQL adalah salah satu sistem manajemen basis data (DBMS) paling populer
di pasaran saat ini. Ia menduduki peringkat kedua setelah Oracle DBMS
dalam Peringkat DB-Engines tahun ini . Karena sebagian besar aplikasi
perangkat lunak perlu berinteraksi dengan data dalam beberapa bentuk,
bahasa pemrograman seperti Python menyediakan alat untuk menyimpan dan
mengakses sumber data ini.

Dengan menggunakan teknik yang dibahas dalam tutorial ini, Anda akan dapat
mengintegrasikan database MySQL dengan aplikasi Python secara efisien. Anda
akan mengembangkan database MySQL kecil untuk sistem pemeringkatan film
dan mempelajari cara melakukan kueri langsung dari kode Python Anda.

Pada akhir tutorial ini, Anda akan dapat:

 Mengidentifikasi fitur unik MySQL


 Hubungkan aplikasi Anda ke database MySQL
 Menanyakan database untuk mengambil data yang diperlukan
 Menangani pengecualian yang terjadi saat mengakses database
 Gunakan praktik terbaik saat membangun aplikasi basis data

Untuk mendapatkan hasil maksimal dari tutorial ini, Anda harus memiliki
pengetahuan tentang konsep Python seperti forloop , fungsi , penanganan
pengecualian , dan menginstal paket Python menggunakan
Python . Anda pipjuga harus memiliki pemahaman dasar tentang sistem
manajemen basis data relasional dan kueri SQL seperti
Python SELECT, DROPPython, Python 3, Python 4, Python 5, Python 6, Python 7,
Python 8, Python 9, Python 10, Python 11, Python 12, Python 13, Python 14,
Python 16, Python 18, Python 19 ...CREATEJOIN
Unduhan Gratis: Dapatkan contoh bab dari Python Tricks: Buku yang
menunjukkan praktik terbaik Python dengan contoh sederhana yang dapat
Anda terapkan secara instan untuk menulis kode + Pythonic yang lebih indah.

Membandingkan MySQL dengan Database SQL Lainnya


SQL adalah singkatan dari Structured Query Language dan merupakan bahasa
pemrograman yang banyak digunakan untuk mengelola basis data relasional.
Anda mungkin pernah mendengar tentang berbagai jenis DBMS berbasis SQL.
Yang paling populer adalah MySQL , PostgreSQL , SQLite , dan SQL Server .
Semua basis data ini mematuhi standar SQL tetapi dengan tingkat kepatuhan
yang berbeda-beda.

Karena merupakan sumber terbuka sejak awal tahun 1995, MySQL dengan
cepat menjadi pemimpin pasar di antara solusi SQL. MySQL juga merupakan
bagian dari ekosistem Oracle. Meskipun fungsionalitas intinya sepenuhnya
gratis, ada juga beberapa add-on berbayar. Saat ini, MySQL digunakan oleh
semua perusahaan teknologi besar, termasuk Google, LinkedIn, Uber, Netflix,
Twitter, dan lainnya.

Selain komunitas open source yang besar untuk dukungan, ada banyak alasan
lain untuk keberhasilan MySQL:

1. Kemudahan instalasi: MySQL dirancang agar mudah digunakan.


Menyiapkan database MySQL cukup mudah, dan beberapa alat pihak
ketiga yang tersedia secara luas, seperti phpMyAdmin , semakin
menyederhanakan proses penyiapan. MySQL tersedia untuk semua
sistem operasi utama, termasuk Windows, macOS, Linux, dan Solaris.

2. Kecepatan: MySQL memiliki reputasi sebagai solusi basis data yang


sangat cepat. Ukurannya relatif lebih kecil dan sangat scalable dalam
jangka panjang.

3. Hak istimewa dan keamanan pengguna: MySQL dilengkapi dengan


skrip yang memungkinkan Anda mengatur tingkat keamanan kata sandi,
menetapkan kata sandi admin, serta menambah dan menghapus hak
istimewa akun pengguna. Skrip ini mempermudah proses admin untuk
portal manajemen pengguna hosting web. DBMS lain, seperti
PostgreSQL, menggunakan berkas konfigurasi yang lebih rumit untuk
digunakan.

Meskipun MySQL terkenal karena kecepatan dan kemudahan penggunaannya,


Anda bisa mendapatkan fitur yang lebih canggih dengan PostgreSQL. Selain itu,
MySQL tidak sepenuhnya sesuai dengan SQL dan memiliki batasan fungsional
tertentu, seperti tidak mendukung FULL JOINklausa.

Anda mungkin juga menghadapi beberapa masalah dengan pembacaan dan


penulisan bersamaan di MySQL. Jika perangkat lunak Anda memiliki banyak
pengguna yang menulis data ke dalamnya sekaligus, maka PostgreSQL
mungkin merupakan pilihan yang lebih cocok.

Catatan: Untuk perbandingan MySQL dan PostgreSQL yang lebih mendalam


dalam konteks dunia nyata, lihat Mengapa Uber Engineering Beralih dari
Postgres ke MySQL .
SQL Server juga merupakan DBMS yang sangat populer dan dikenal karena
keandalan, efisiensi, dan keamanannya. SQL Server lebih disukai oleh
perusahaan, terutama di bidang perbankan, yang secara teratur menangani
beban kerja lalu lintas yang besar. SQL Server merupakan solusi komersial dan
merupakan salah satu sistem yang paling kompatibel dengan layanan Windows.

Pada tahun 2010, ketika Oracle mengakuisisi Sun Microsystems dan MySQL,
banyak yang khawatir tentang masa depan MySQL. Saat itu, Oracle merupakan
pesaing terbesar MySQL. Para pengembang khawatir bahwa ini merupakan
pengambilalihan paksa dari Oracle dengan tujuan menghancurkan MySQL.

Beberapa pengembang yang dipimpin oleh Michael Widenius , penulis asli


MySQL, membuat cabang dari basis kode MySQL dan meletakkan dasar
bagi MariaDB . Tujuannya adalah untuk mengamankan akses ke MySQL dan
membuatnya tetap gratis selamanya.

Hingga saat ini, MariaDB tetap berlisensi penuh GPL , sehingga sepenuhnya
menjadi domain publik. Di sisi lain, beberapa fitur MySQL hanya tersedia
dengan lisensi berbayar. Selain itu, MariaDB menyediakan beberapa fitur yang
sangat berguna yang tidak didukung oleh server MySQL, seperti SQL
terdistribusi dan penyimpanan kolom . Anda dapat menemukan lebih banyak
perbedaan antara MySQL dan MariaDB yang tercantum di situs web MariaDB .

MySQL menggunakan sintaksis yang sangat mirip dengan SQL Standar. Akan
tetapi, ada beberapa perbedaan penting yang disebutkan dalam dokumentasi
resmi .

Hapus iklan
Menginstal Server MySQL dan Konektor MySQL/Python
Sekarang, untuk mulai mengerjakan tutorial ini, Anda perlu menyiapkan dua
hal: server MySQL dan konektor MySQL . Server MySQL akan menyediakan
semua layanan yang diperlukan untuk menangani basis data Anda. Setela⁸h
server aktif dan berjalan, Anda dapat menghubungkan aplikasi Python Anda
dengannya menggunakan Konektor MySQL/Python.

Menginstal Server MySQL


Dokumentasi resmi merinci cara yang direkomendasikan untuk mengunduh
dan menginstal server MySQL. Anda akan menemukan petunjuk untuk semua
sistem operasi populer, termasuk Windows , macOS , Solaris , Linux , dan masih
banyak lagi.

Untuk Windows, cara terbaik adalah mengunduh MySQL Installer dan


membiarkannya mengurus seluruh proses. Pengelola instalasi juga membantu
Anda mengonfigurasi pengaturan keamanan server MySQL. Pada halaman Akun
dan Peran, Anda perlu memasukkan kata sandi untuk akun root (admin) dan
juga secara opsional menambahkan pengguna lain dengan hak istimewa yang
berbeda-beda:
P
engaturan Akun Pemasang MySQL

Meskipun Anda harus menentukan kredensial untuk akun root selama


penyiapan, Anda dapat mengubah pengaturan ini nanti.

Catatan: Ingat nama host, nama pengguna, dan kata sandi karena ini akan
diperlukan untuk membuat koneksi dengan server MySQL nanti.
Meskipun Anda hanya memerlukan server MySQL untuk tutorial ini, Anda juga
dapat menyiapkan alat bantu lain seperti MySQL Workbench menggunakan
penginstal ini. Jika Anda tidak ingin menginstal MySQL langsung di sistem
operasi Anda, maka menggunakan MySQL di Linux dengan Docker merupakan
alternatif yang mudah.

Memasang Konektor MySQL/Python


Driver basis data adalah perangkat lunak yang memungkinkan aplikasi
terhubung dan berinteraksi dengan sistem basis data. Bahasa pemrograman
seperti Python memerlukan driver khusus sebelum dapat berkomunikasi
dengan basis data dari vendor tertentu.

Driver ini biasanya diperoleh sebagai modul pihak ketiga. Python Database
API (DB-API) mendefinisikan antarmuka standar yang harus dipatuhi oleh
semua driver database Python. Rincian ini didokumentasikan dalam PEP
249. Semua driver database Python, seperti sqlite3 untuk SQLite, psycopg untuk
PostgreSQL, dan MySQL Connector/Python untuk MySQL, mengikuti aturan
implementasi ini.

Catatan: Dokumentasi resmi MySQL menggunakan


istilah konektor, bukan driver . Secara teknis, konektor hanya dikaitkan
dengan koneksi ke basis data, bukan interaksi dengannya. Namun, istilah ini
sering digunakan untuk seluruh modul akses basis data yang terdiri dari
konektor dan driver.

Untuk menjaga konsistensi dengan dokumentasi, Anda akan melihat


istilah konektor setiap kali MySQL disebutkan.
Banyak bahasa pemrograman populer yang memiliki API basis data mereka
sendiri. Misalnya, Java memiliki API Java Database Connectivity (JDBC) . Jika
Anda perlu menghubungkan aplikasi Java ke basis data MySQL, maka Anda
perlu menggunakan konektor MySQL JDBC , yang mengikuti API JDBC.

Demikian pula, dalam Python Anda perlu memasang konektor Python MySQL
untuk berinteraksi dengan basis data MySQL. Banyak paket yang mengikuti
standar DB-API, tetapi yang paling populer di antaranya adalah Konektor
MySQL/Python . Anda bisa mendapatkannya dengan pip:

Kerang

$ pip install mysql-connector-python


pipmemasang konektor sebagai modul pihak ketiga di lingkungan virtual yang
sedang aktif. Sebaiknya Anda menyiapkan lingkungan virtual yang
terisolasi untuk proyek tersebut beserta semua dependensinya.

Untuk menguji apakah instalasi berhasil, ketik perintah berikut


pada terminal Python Anda :

Ular piton

>>> import mysql.connector


Jika kode di atas dijalankan tanpa kesalahan, berarti mysql.connectorsudah
terinstal dan siap digunakan. Jika Anda mengalami kesalahan, pastikan Anda
berada di lingkungan virtual yang benar dan menggunakan interpreter Python
yang tepat.

Pastikan Anda memasang mysql-connector-pythonpaket yang benar, yang


merupakan implementasi Python murni. Waspadalah terhadap konektor
dengan nama yang mirip tetapi sekarang sudah tidak digunakan lagi
seperti mysql-connector.

Hapus iklan

Membuat Koneksi Dengan Server MySQL


MySQL adalah sistem manajemen basis data berbasis server . Satu server
dapat berisi beberapa basis data. Untuk berinteraksi dengan basis data, Anda
harus terlebih dahulu membuat koneksi dengan server. Alur kerja umum
program Python yang berinteraksi dengan basis data berbasis MySQL adalah
sebagai berikut:

1. Hubungkan ke server MySQL.


2. Buat basis data baru.
3. Hubungkan ke basis data yang baru dibuat atau yang sudah ada.
4. Menjalankan perintah SQL dan mengambil hasilnya.
5. Beritahukan basis data jika ada perubahan yang dibuat pada tabel.
6. Tutup koneksi ke server MySQL.

Ini adalah alur kerja umum yang mungkin berbeda-beda tergantung pada
aplikasi masing-masing. Namun, apa pun aplikasinya, langkah pertama adalah
menghubungkan basis data dengan aplikasi Anda.

Membangun Koneksi
Langkah pertama dalam berinteraksi dengan server MySQL adalah membuat
koneksi. Untuk melakukannya, Anda
memerlukan connect()modul mysql.connector. Fungsi ini menerima
parameter seperti host, user, dan passworddan
mengembalikan MySQLConnectionobjek. Anda dapat menerima kredensial ini
sebagai input dari pengguna dan meneruskannya ke connect():

Ular piton

from getpass import getpass


from mysql.connector import connect, Error

try:
with connect(
host="localhost",
user=input("Enter username: "),
password=getpass("Enter password: "),
) as connection:
print(connection)
except Error as e:
print(e)
Kode di atas menggunakan kredensial login yang dimasukkan untuk membuat
koneksi dengan server MySQL Anda. Sebagai gantinya, Anda mendapatkan
objek MySQLConnection, yang disimpan dalam connectionvariabel. Mulai
sekarang, Anda akan menggunakan variabel ini untuk mengakses server MySQL
Anda.

Ada beberapa hal penting yang perlu diperhatikan dalam kode di atas:

 Anda harus selalu menangani pengecualian yang mungkin muncul saat


membuat koneksi ke server MySQL. Inilah sebabnya Anda menggunakan
blok try…except untuk menangkap dan mencetak pengecualian apa
pun yang mungkin Anda temui.

 Anda harus selalu menutup koneksi setelah selesai mengakses basis data.
Membiarkan koneksi terbuka yang tidak digunakan dapat menyebabkan
beberapa kesalahan tak terduga dan masalah kinerja. Kode di atas
memanfaatkan manajer konteks menggunakanwith , yang
mengabstraksikan proses pembersihan koneksi.

 Anda tidak boleh membuat kode keras kredensial login Anda , yaitu nama
pengguna dan kata sandi Anda, langsung dalam skrip Python. Ini adalah
praktik yang buruk untuk penyebaran dan menimbulkan ancaman
keamanan yang serius . Kode di atas meminta kredensial login pengguna.
Kode ini menggunakan modul bawaan getpassuntuk menyembunyikan
kata sandi. Meskipun ini lebih baik daripada membuat kode keras, ada
cara lain yang lebih aman untuk menyimpan informasi sensitif, seperti
menggunakan variabel lingkungan .

Anda kini telah membuat koneksi antara program Anda dan server MySQL Anda,
tetapi Anda masih perlu membuat basis data baru atau menghubungkan ke
basis data yang sudah ada di dalam server.

Membuat Database Baru


Pada bagian terakhir, Anda telah membuat koneksi dengan server MySQL Anda.
Untuk membuat database baru, Anda perlu menjalankan pernyataan SQL:
Bahasa Indonesia: SQL

CREATE DATABASE books_db;


Pernyataan di atas akan membuat database baru dengan nama books_db.

Catatan: Di MySQL, wajib untuk meletakkan titik koma ( ;) di akhir pernyataan,


yang menandakan berakhirnya kueri. Namun, MySQL Connector/Python secara
otomatis menambahkan titik koma di akhir kueri Anda, jadi tidak perlu
menggunakannya dalam kode Python Anda.
Untuk menjalankan kueri SQL dalam Python, Anda perlu menggunakan kursor ,
yang mengabstraksikan akses ke rekaman basis data. MySQL Connector/Python
menyediakan kelas MySQLCursor, yang membuat contoh objek yang dapat
menjalankan kueri MySQL dalam Python. Contoh kelas MySQLCursorjuga
disebut cursor.

cursorObjek menggunakan objek MySQLConnectionuntuk berinteraksi dengan


server MySQL Anda. Untuk membuat objek cursor, gunakan .cursor()metode
variabel Anda connection:

Ular piton

cursor = connection.cursor()
Kode di atas memberi Anda contoh kelas MySQLCursor.

Permintaan yang perlu dieksekusi dikirim ke cursor.execute()dalam


format string . Dalam kasus khusus ini, Anda akan mengirim CREATE
DATABASEpermintaan ke cursor.execute():

Ular piton

from getpass import getpass


from mysql.connector import connect, Error

try:
with connect(
host="localhost",
user=input("Enter username: "),
password=getpass("Enter password: "),
) as connection:
create_db_query = "CREATE DATABASE online_movie_rating"
with connection.cursor() as cursor:
cursor.execute(create_db_query)
except Error as e:
print(e)
Setelah mengeksekusi kode di atas, Anda akan memiliki database baru yang
disebut online_movie_ratingdi server MySQL Anda.

Kueri CREATE DATABASEdisimpan sebagai string


dalam create_db_queryvariabel dan kemudian
diteruskan cursor.execute()untuk dieksekusi. Kode tersebut menggunakan
pengelola konteks dengan cursorobjek untuk menangani proses pembersihan.

Anda mungkin menerima galat di sini jika basis data dengan nama yang sama
sudah ada di server Anda. Untuk mengonfirmasi hal ini, Anda dapat
menampilkan nama semua basis data di server Anda. Dengan
menggunakan MySQLConnectionobjek yang sama dari sebelumnya,
jalankan SHOW DATABASESpernyataan :

Ular piton

>>> show_db_query = "SHOW DATABASES"


>>> with connection.cursor() as cursor:
... cursor.execute(show_db_query)
... for db in cursor:
... print(db)
...
('information_schema',)
('mysql',)
('online_movie_rating',)
('performance_schema',)
('sys',)
Kode di atas mencetak nama semua basis data yang saat ini ada di server
MySQL Anda. SHOW DATABASESPerintah tersebut juga menampilkan beberapa
basis data yang tidak Anda buat di server,
seperti information_schema, performance_schema, dan seterusnya. Basis data
ini dibuat secara otomatis oleh server MySQL dan menyediakan akses ke
berbagai metadata basis data dan pengaturan server MySQL.

Anda membuat basis data baru di bagian ini dengan menjalankan CREATE
DATABASEpernyataan . Di bagian berikutnya, Anda akan melihat cara
menghubungkan ke basis data yang sudah ada.
Hapus iklan

Menghubungkan ke Basis Data yang Ada


Di bagian terakhir, Anda membuat database baru
bernama online_movie_rating. Namun, Anda masih belum terhubung ke
database tersebut. Dalam banyak situasi, Anda sudah memiliki database MySQL
yang ingin Anda hubungkan dengan aplikasi Python Anda.

Anda dapat melakukan ini menggunakan connect()fungsi yang sama yang


Anda gunakan sebelumnya dengan mengirimkan parameter tambahan yang
disebut database:

Ular piton

from getpass import getpass


from mysql.connector import connect, Error

try:
with connect(
host="localhost",
user=input("Enter username: "),
password=getpass("Enter password: "),
database="online_movie_rating",
) as connection:
print(connection)
except Error as e:
print(e)
Kode di atas sangat mirip dengan skrip koneksi yang Anda gunakan
sebelumnya. Satu-satunya perubahan di sini adalah databaseparameter
tambahan, tempat nama basis data Anda diteruskan ke connect(). Setelah
Anda menjalankan skrip ini, Anda akan terhubung
ke online_movie_ratingbasis data.

Membuat, Mengubah, dan Menghapus Tabel


Di bagian ini, Anda akan mempelajari cara menjalankan
beberapa kueri DDLCREATE dasar seperti , DROP, dan ALTERdengan Python. Anda
akan melihat sekilas basis data MySQL yang akan Anda gunakan di sisa tutorial
ini. Anda juga akan membuat semua tabel yang diperlukan untuk basis data dan
mempelajari cara melakukan modifikasi pada tabel ini nanti.
Mendefinisikan Skema Basis Data
Anda dapat memulai dengan membuat skema basis data untuk sistem
pemeringkatan film daring. Basis data akan terdiri dari tiga tabel:

1. moviesberisi informasi umum tentang film dan memiliki atribut berikut:


o id
o title
o release_year
o genre
o collection_in_mil
2. reviewersberisi informasi tentang orang-orang yang memposting ulasan
atau peringkat dan memiliki atribut berikut:
o id
o first_name
o last_name
3. ratingsberisi informasi tentang peringkat yang telah diposting dan
memiliki atribut berikut:
o movie_id(kunci asing)
o reviewer_id(kunci asing)
o rating

Sistem pemeringkatan film di dunia nyata, seperti IMDb , perlu menyimpan


sejumlah atribut lain, seperti email, daftar pemeran film, dan sebagainya. Jika
Anda mau, Anda dapat menambahkan lebih banyak tabel dan atribut ke basis
data ini. Namun, ketiga tabel ini sudah cukup untuk tujuan tutorial ini.

Gambar di bawah ini menggambarkan skema basis data:


Diagram Skema untuk Sistem Penilaian Film Online

Tabel-tabel dalam basis data ini saling terkait moviesdan reviewersakan


memiliki hubungan banyak ke banyak karena satu film dapat diulas oleh
beberapa pengulas dan satu pengulas dapat mengulas beberapa
film. ratingsTabel menghubungkan moviestabel dengan reviewerstabel.

Membuat Tabel Menggunakan CREATE TABLEPernyataan


Sekarang, untuk membuat tabel baru di MySQL, Anda perlu
menggunakan CREATE TABLEpernyataan . Kueri MySQL berikut akan
membuat moviestabel untuk basis data Anda online_movie_rating:

Bahasa Indonesia: SQL

CREATE TABLE movies(


id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
release_year YEAR(4),
genre VARCHAR(100),
collection_in_mil INT
);
Jika Anda pernah membaca pernyataan SQL sebelumnya, maka sebagian besar
kueri di atas mungkin masuk akal. Namun, ada beberapa perbedaan dalam
sintaksis MySQL yang perlu Anda ketahui.

Misalnya, MySQL memiliki beragam tipe data untuk Anda pelajari,


termasuk YEAR, INT, BIGINT, dan seterusnya. Selain itu, MySQL
menggunakan AUTO_INCREMENTkata kunci tersebut saat nilai kolom harus
ditingkatkan secara otomatis saat penyisipan data baru.

Untuk membuat tabel baru, Anda perlu meneruskan kueri ini


ke cursor.execute(), yang menerima kueri MySQL dan mengeksekusi kueri
tersebut pada database MySQL yang terhubung:

Ular piton

create_movies_table_query = """
CREATE TABLE movies(
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
release_year YEAR(4),
genre VARCHAR(100),
collection_in_mil INT
)
"""
with connection.cursor() as cursor:
cursor.execute(create_movies_table_query)
connection.commit()
Sekarang Anda memiliki moviestabel di database Anda. Anda
meneruskan create_movies_table_queryke cursor.execute(), yang
menjalankan eksekusi yang diperlukan.

Catatan: Variabel connectionmerujuk pada MySQLConnectionobjek yang


dikembalikan saat Anda terhubung ke basis data Anda.
Perhatikan juga connection.commit()pernyataan di akhir kode. Secara default,
konektor MySQL Anda tidak melakukan autocommit transaksi . Di MySQL,
modifikasi yang disebutkan dalam transaksi hanya terjadi saat Anda
menggunakan COMMITperintah di bagian akhir. Selalu panggil metode ini setelah
setiap transaksi untuk melakukan perubahan pada tabel yang sebenarnya.

Seperti yang Anda lakukan dengan moviestabel, jalankan skrip berikut untuk
membuat reviewerstabel:

Ular piton

create_reviewers_table_query = """
CREATE TABLE reviewers (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(100),
last_name VARCHAR(100)
)
"""
with connection.cursor() as cursor:
cursor.execute(create_reviewers_table_query)
connection.commit()
Jika diperlukan, Anda dapat menambahkan informasi lebih lanjut tentang
pengulas, seperti ID email atau informasi demografisnya.
Namun, first_nameuntuk last_namesaat ini, hal tersebut akan sesuai dengan
tujuan Anda.

Terakhir, Anda dapat membuat ratingstabel menggunakan skrip berikut:

Ular piton

create_ratings_table_query = """
CREATE TABLE ratings (
movie_id INT,
reviewer_id INT,
rating DECIMAL(2,1),
FOREIGN KEY(movie_id) REFERENCES movies(id),
FOREIGN KEY(reviewer_id) REFERENCES reviewers(id),
PRIMARY KEY(movie_id, reviewer_id)
)
"""
with connection.cursor() as cursor:
cursor.execute(create_ratings_table_query)
connection.commit()
Implementasi hubungan kunci asing di MySQL sedikit berbeda dan terbatas
dibandingkan dengan SQL standar . Di MySQL, induk dan anak dalam batasan
kunci asing harus menggunakan mesin penyimpanan yang sama .

Mesin penyimpanan adalah komponen perangkat lunak dasar yang digunakan


sistem manajemen basis data untuk menjalankan operasi SQL. Dalam MySQL,
mesin penyimpanan tersedia dalam dua bentuk berbeda:

1. Mesin penyimpanan transaksional aman untuk transaksi dan


memungkinkan Anda untuk memutar kembali transaksi menggunakan
perintah sederhana seperti rollback. Banyak mesin MySQL populer,
termasuk InnoDB dan NDB , termasuk dalam kategori ini.

2. Mesin penyimpanan nontransaksional bergantung pada kode manual


yang rumit untuk membatalkan pernyataan yang dibuat pada basis
data. MyISAM , MEMORY , dan banyak mesin MySQL lainnya bersifat
nontransaksional.

InnoDB adalah mesin penyimpanan default dan paling populer. Mesin ini
membantu menjaga integritas data dengan mendukung batasan kunci asing .
Ini berarti bahwa setiap operasi CRUD pada kunci asing diperiksa untuk
memastikan bahwa operasi tersebut tidak menyebabkan ketidakkonsistenan di
berbagai tabel.

Perhatikan juga bahwa ratingstabel tersebut menggunakan


kolom movie_iddan reviewer_id, keduanya merupakan kunci asing, secara
bersamaan sebagai kunci utama . Langkah ini memastikan bahwa pengulas
tidak dapat menilai film yang sama dua kali.

Anda dapat memilih untuk menggunakan kembali kursor yang sama untuk
beberapa eksekusi. Dalam hal tersebut, semua eksekusi akan menjadi
satu transaksi atomik , bukan beberapa transaksi terpisah. Misalnya, Anda
dapat mengeksekusi semua CREATE TABLEpernyataan dengan satu kursor, lalu
melakukan transaksi Anda hanya sekali:

Ular piton

with connection.cursor() as cursor:


cursor.execute(create_movies_table_query)
cursor.execute(create_reviewers_table_query)
cursor.execute(create_ratings_table_query)
connection.commit()
Kode di atas akan terlebih dahulu menjalankan ketiga CREATEpernyataan
tersebut. Kemudian, kode akan mengirimkan COMMITperintah ke server MySQL
yang akan melakukan transaksi Anda. Anda juga dapat menggunakan perintah
ini .rollback()untuk mengirimkan ROLLBACKperintah ke server MySQL dan
menghapus semua perubahan data dari transaksi.

Menampilkan Skema Tabel Menggunakan DESCRIBEPernyataan


Sekarang, setelah Anda membuat ketiga tabel, Anda dapat melihat skemanya
menggunakan pernyataan SQL berikut:

Bahasa Indonesia: SQL

DESCRIBE <table_name>;
Untuk mendapatkan beberapa hasil dari cursorobjek, Anda perlu
menggunakan cursor.fetchall(). Metode ini mengambil semua baris dari
pernyataan yang terakhir dieksekusi. Dengan asumsi Anda sudah memiliki
objek MySQLConnectiondalam connectionvariabel, Anda dapat mencetak
semua hasil yang diambil oleh cursor.fetchall():

Ular piton

>>> show_table_query = "DESCRIBE movies"


>>> with connection.cursor() as cursor:
... cursor.execute(show_table_query)
... # Fetch rows from last executed query
... result = cursor.fetchall()
... for row in result:
... print(row)
...
('id', 'int(11)', 'NO', 'PRI', None, 'auto_increment')
('title', 'varchar(100)', 'YES', '', None, '')
('release_year', 'year(4)', 'YES', '', None, '')
('genre', 'varchar(100)', 'YES', '', None, '')
('collection_in_mil', 'int(11)', 'YES', '', None, '')
Setelah Anda menjalankan kode di atas, Anda akan menerima tabel yang berisi
informasi tentang semua kolom dalam moviestabel. Untuk setiap kolom, Anda
akan menerima detail seperti tipe data kolom, apakah kolom tersebut
merupakan kunci utama, dan sebagainya.
Memodifikasi Skema Tabel Menggunakan ALTERPernyataan
Dalam moviestabel, Anda memiliki kolom bernama collection_in_mil, yang
berisi pendapatan film dalam jutaan dolar. Anda dapat menulis pernyataan
MySQL berikut untuk mengubah tipe data collection_in_milatribut
dari INTmenjadi DECIMAL:

Bahasa Indonesia: SQL

ALTER TABLE movies MODIFY COLUMN collection_in_mil DECIMAL(4,1);


DECIMAL(4,1)berarti angka desimal yang dapat memiliki maksimal 4digit yang
merupakan 1desimal, seperti 120.1, 3.4, 38.0, dan seterusnya. Setelah
menjalankan ALTER TABLEpernyataan , Anda dapat menampilkan skema tabel
yang diperbarui menggunakan DESCRIBE:

Ular piton

>>> alter_table_query = """


... ALTER TABLE movies
... MODIFY COLUMN collection_in_mil DECIMAL(4,1)
... """
>>> show_table_query = "DESCRIBE movies"
>>> with connection.cursor() as cursor:
... cursor.execute(alter_table_query)
... cursor.execute(show_table_query)
... # Fetch rows from last executed query
... result = cursor.fetchall()
... print("Movie Table Schema after alteration:")
... for row in result:
... print(row)
...
Movie Table Schema after alteration
('id', 'int(11)', 'NO', 'PRI', None, 'auto_increment')
('title', 'varchar(100)', 'YES', '', None, '')
('release_year', 'year(4)', 'YES', '', None, '')
('genre', 'varchar(100)', 'YES', '', None, '')
('collection_in_mil', 'decimal(4,1)', 'YES', '', None, '')
Seperti yang ditunjukkan pada output, collection_in_milatribut sekarang
bertipe DECIMAL(4,1). Perhatikan juga bahwa dalam kode di atas, Anda
memanggil cursor.execute()dua kali. Namun cursor.fetchall()mengambil
baris hanya dari kueri yang terakhir dieksekusi, yaitu show_table_query.
Menghapus Tabel Menggunakan DROPPernyataan
Untuk menghapus tabel, Anda perlu menjalankan DROP TABLEpernyataan di
MySQL. Menghapus tabel adalah proses yang tidak dapat dibatalkan . Jika Anda
menjalankan kode di bawah ini, maka Anda perlu memanggil CREATE
TABLEkueri lagi untuk menggunakan ratingstabel di bagian selanjutnya.

Untuk menghapus ratingstabel, kirim drop_table_queryke cursor.execute():

Ular piton

drop_table_query = "DROP TABLE ratings"


with connection.cursor() as cursor:
cursor.execute(drop_table_query)
Jika Anda mengeksekusi kode di atas, Anda akan berhasil
menghapus ratingstabel tersebut.

Memasukkan Rekaman ke dalam Tabel


Di bagian terakhir, Anda membuat tiga tabel di basis data
Anda: movies, reviewers, dan ratings. Sekarang Anda perlu mengisi tabel-
tabel ini dengan data. Bagian ini akan membahas dua cara berbeda untuk
memasukkan data ke dalam Konektor MySQL untuk Python.

Metode pertama, .execute(), berfungsi dengan baik ketika jumlah rekaman


kecil dan rekaman dapat dikodekan secara keras. Metode
kedua, .executemany(), lebih populer dan lebih cocok untuk skenario dunia
nyata.

Hapus iklan

Menggunakan.execute()
Pendekatan pertama menggunakan cursor.execute()metode yang sama
dengan yang telah Anda gunakan selama ini. Anda menulis INSERT
INTOkueri dalam bentuk string dan meneruskannya ke cursor.execute(). Anda
dapat menggunakan metode ini untuk memasukkan data ke
dalam moviestabel.

Sebagai referensi, moviestabel ini memiliki lima atribut:

1. id
2. title
3. release_year
4. genre
5. collection_in_mil

Anda tidak perlu menambahkan data idkarena AUTO_INCREMENTperhitungan


akan dilakukan secara otomatis iduntuk Anda. Skrip berikut menyisipkan data
ke dalam moviestabel:

Ular piton

insert_movies_query = """
INSERT INTO movies (title, release_year, genre, collection_in_mil)
VALUES
("Forrest Gump", 1994, "Drama", 330.2),
("3 Idiots", 2009, "Drama", 2.4),
("Eternal Sunshine of the Spotless Mind", 2004, "Drama", 34.5),
("Good Will Hunting", 1997, "Drama", 138.1),
("Skyfall", 2012, "Action", 304.6),
("Gladiator", 2000, "Action", 188.7),
("Black", 2005, "Drama", 3.0),
("Titanic", 1997, "Romance", 659.2),
("The Shawshank Redemption", 1994, "Drama",28.4),
("Udaan", 2010, "Drama", 1.5),
("Home Alone", 1990, "Comedy", 286.9),
("Casablanca", 1942, "Romance", 1.0),
("Avengers: Endgame", 2019, "Action", 858.8),
("Night of the Living Dead", 1968, "Horror", 2.5),
("The Godfather", 1972, "Crime", 135.6),
("Haider", 2014, "Action", 4.2),
("Inception", 2010, "Adventure", 293.7),
("Evil", 2003, "Horror", 1.3),
("Toy Story 4", 2019, "Animation", 434.9),
("Air Force One", 1997, "Drama", 138.1),
("The Dark Knight", 2008, "Action",535.4),
("Bhaag Milkha Bhaag", 2013, "Sport", 4.1),
("The Lion King", 1994, "Animation", 423.6),
("Pulp Fiction", 1994, "Crime", 108.8),
("Kai Po Che", 2013, "Sport", 6.0),
("Beasts of No Nation", 2015, "War", 1.4),
("Andadhun", 2018, "Thriller", 2.9),
("The Silence of the Lambs", 1991, "Crime", 68.2),
("Deadpool", 2016, "Action", 363.6),
("Drishyam", 2015, "Mystery", 3.0)
"""
with connection.cursor() as cursor:
cursor.execute(insert_movies_query)
connection.commit()
Tabel moviessekarang terisi dengan tiga puluh catatan. Kode akan
dipanggil connection.commit()di bagian akhir. Sangat penting untuk
memanggil .commit()setelah melakukan modifikasi pada tabel.

Menggunakan.executemany()
Pendekatan sebelumnya lebih cocok jika jumlah rekaman cukup kecil dan Anda
dapat langsung menuliskan rekaman ini ke dalam kode. Namun, hal ini jarang
terjadi. Anda sering kali menyimpan data ini di berkas lain, atau data akan
dibuat oleh skrip lain dan perlu ditambahkan ke basis data MySQL.

Di sinilah .executemany()berguna. Ia menerima dua parameter:

1. Kueri yang berisi tempat penampung untuk rekaman yang perlu


disisipkan
2. Daftar yang berisi semua rekaman yang ingin Anda masukkan

Contoh berikut menyisipkan rekaman untuk reviewerstabel:

Ular piton

insert_reviewers_query = """
INSERT INTO reviewers
(first_name, last_name)
VALUES ( %s, %s )
"""
reviewers_records = [
("Chaitanya", "Baweja"),
("Mary", "Cooper"),
("John", "Wayne"),
("Thomas", "Stoneman"),
("Penny", "Hofstadter"),
("Mitchell", "Marsh"),
("Wyatt", "Skaggs"),
("Andre", "Veiga"),
("Sheldon", "Cooper"),
("Kimbra", "Masters"),
("Kat", "Dennings"),
("Bruce", "Wayne"),
("Domingo", "Cortes"),
("Rajesh", "Koothrappali"),
("Ben", "Glocker"),
("Mahinder", "Dhoni"),
("Akbar", "Khan"),
("Howard", "Wolowitz"),
("Pinkie", "Petit"),
("Gurkaran", "Singh"),
("Amy", "Farah Fowler"),
("Marlon", "Crafford"),
]
with connection.cursor() as cursor:
cursor.executemany(insert_reviewers_query, reviewers_records)
connection.commit()
Dalam skrip di atas, Anda meneruskan kueri dan daftar rekaman sebagai
argumen ke .executemany(). Rekaman ini dapat diambil dari file atau dari
pengguna dan disimpan dalam reviewers_recordsdaftar.

Kode tersebut digunakan %ssebagai placeholder untuk dua string yang harus
disisipkan dalam insert_reviewers_query. Placeholder berfungsi
sebagai penentu format dan membantu menyediakan tempat untuk variabel di
dalam string. Variabel yang ditentukan kemudian ditambahkan ke tempat ini
selama eksekusi.

Anda juga dapat menggunakannya .executemany()untuk menyisipkan


rekaman ke dalam ratingstabel:

Ular piton

insert_ratings_query = """
INSERT INTO ratings
(rating, movie_id, reviewer_id)
VALUES ( %s, %s, %s)
"""
ratings_records = [
(6.4, 17, 5), (5.6, 19, 1), (6.3, 22, 14), (5.1, 21, 17),
(5.0, 5, 5), (6.5, 21, 5), (8.5, 30, 13), (9.7, 6, 4),
(8.5, 24, 12), (9.9, 14, 9), (8.7, 26, 14), (9.9, 6, 10),
(5.1, 30, 6), (5.4, 18, 16), (6.2, 6, 20), (7.3, 21, 19),
(8.1, 17, 18), (5.0, 7, 2), (9.8, 23, 3), (8.0, 22, 9),
(8.5, 11, 13), (5.0, 5, 11), (5.7, 8, 2), (7.6, 25, 19),
(5.2, 18, 15), (9.7, 13, 3), (5.8, 18, 8), (5.8, 30, 15),
(8.4, 21, 18), (6.2, 23, 16), (7.0, 10, 18), (9.5, 30, 20),
(8.9, 3, 19), (6.4, 12, 2), (7.8, 12, 22), (9.9, 15, 13),
(7.5, 20, 17), (9.0, 25, 6), (8.5, 23, 2), (5.3, 30, 17),
(6.4, 5, 10), (8.1, 5, 21), (5.7, 22, 1), (6.3, 28, 4),
(9.8, 13, 1)
]
with connection.cursor() as cursor:
cursor.executemany(insert_ratings_query, ratings_records)
connection.commit()
Ketiga tabel sekarang terisi dengan data. Anda sekarang memiliki basis data
rating film daring yang berfungsi penuh. Langkah selanjutnya adalah
memahami cara berinteraksi dengan basis data ini.

Membaca Catatan Dari Basis Data


Sampai saat ini, Anda telah membangun basis data Anda. Sekarang saatnya
untuk melakukan beberapa kueri pada basis data tersebut dan menemukan
beberapa properti menarik dari kumpulan data ini. Di bagian ini, Anda akan
mempelajari cara membaca catatan dari tabel basis data
menggunakan SELECTpernyataan .

Membaca Catatan Menggunakan SELECTPernyataan


Untuk mengambil data, Anda perlu mengirim SELECTkueri
ke cursor.execute(). Kemudian, Anda
menggunakan cursor.fetchall()untuk mengekstrak tabel yang diambil
dalam bentuk daftar baris atau data.

Coba tulis kueri MySQL untuk memilih semua rekaman dari moviestabel dan
mengirimkannya ke .execute():

Ular piton

>>> select_movies_query = "SELECT * FROM movies LIMIT 5"


>>> with connection.cursor() as cursor:
... cursor.execute(select_movies_query)
... result = cursor.fetchall()
... for row in result:
... print(row)
...
(1, 'Forrest Gump', 1994, 'Drama', Decimal('330.2'))
(2, '3 Idiots', 2009, 'Drama', Decimal('2.4'))
(3, 'Eternal Sunshine of the Spotless Mind', 2004, 'Drama',
Decimal('34.5'))
(4, 'Good Will Hunting', 1997, 'Drama', Decimal('138.1'))
(5, 'Skyfall', 2012, 'Action', Decimal('304.6'))
Variabel tersebut resultmenyimpan rekaman yang dikembalikan dari
penggunaan .fetchall(). Ini adalah daftar tupel yang mewakili rekaman
individual dari tabel.

Pada kueri di atas, Anda menggunakan LIMITklausa untuk membatasi jumlah


baris yang diterima dari SELECTpernyataan. Pengembang sering kali
menggunakan LIMITpagination saat menangani data dalam jumlah besar.

Di MySQL, LIMITklausa tersebut mengambil satu atau dua argumen numerik


nonnegatif. Saat menggunakan satu argumen, Anda menentukan jumlah baris
maksimum yang akan dikembalikan. Karena kueri Anda menyertakan LIMIT 5,
hanya rekaman pertama 5yang diambil. Saat menggunakan kedua argumen,
Anda juga dapat menentukan offset baris pertama yang akan dikembalikan:

Bahasa Indonesia: SQL

SELECT * FROM movies LIMIT 2,5;


Argumen pertama menentukan offset sebesar 2, dan argumen kedua
membatasi jumlah baris yang dikembalikan menjadi 5. Kueri di atas akan
mengembalikan baris 3 hingga 7.

Anda juga dapat melakukan kueri untuk kolom yang dipilih:

Ular piton

>>> select_movies_query = "SELECT title, release_year FROM movies LIMIT 5"


>>> with connection.cursor() as cursor:
... cursor.execute(select_movies_query)
... for row in cursor.fetchall():
... print(row)
...
('Forrest Gump', 1994)
('3 Idiots', 2009)
('Eternal Sunshine of the Spotless Mind', 2004)
('Good Will Hunting', 1997)
('Skyfall', 2012)
Sekarang, kode tersebut hanya mengeluarkan nilai dari dua kolom yang
ditentukan: titledan release_year.

Memfilter Hasil Menggunakan WHEREKlausa


Anda dapat memfilter data tabel berdasarkan kriteria tertentu
menggunakan WHEREklausa. Misalnya, untuk mengambil semua film dengan
pendapatan box office lebih dari $300 juta, Anda dapat menjalankan kueri
berikut:

Bahasa Indonesia: SQL

SELECT title, collection_in_mil


FROM movies
WHERE collection_in_mil > 300;
Anda juga dapat menggunakan ORDER BYklausa pada kueri terakhir untuk
mengurutkan hasil dari penghasil tertinggi ke terendah:

Ular piton

>>> select_movies_query = """


... SELECT title, collection_in_mil
... FROM movies
... WHERE collection_in_mil > 300
... ORDER BY collection_in_mil DESC
... """
>>> with connection.cursor() as cursor:
... cursor.execute(select_movies_query)
... for movie in cursor.fetchall():
... print(movie)
...
('Avengers: Endgame', Decimal('858.8'))
('Titanic', Decimal('659.2'))
('The Dark Knight', Decimal('535.4'))
('Toy Story 4', Decimal('434.9'))
('The Lion King', Decimal('423.6'))
('Deadpool', Decimal('363.6'))
('Forrest Gump', Decimal('330.2'))
('Skyfall', Decimal('304.6'))
MySQL menawarkan banyak sekali operasi pemformatan
string seperti CONCATpenggabungan string. Sering kali, situs web akan
menampilkan judul film beserta tahun rilisnya untuk menghindari kebingungan.
Untuk mengambil judul lima film terlaris, yang digabungkan dengan tahun
rilisnya, Anda dapat menulis kueri berikut:

Ular piton

>>> select_movies_query = """


... SELECT CONCAT(title, " (", release_year, ")"),
... collection_in_mil
... FROM movies
... ORDER BY collection_in_mil DESC
... LIMIT 5
... """
>>> with connection.cursor() as cursor:
... cursor.execute(select_movies_query)
... for movie in cursor.fetchall():
... print(movie)
...
('Avengers: Endgame (2019)', Decimal('858.8'))
('Titanic (1997)', Decimal('659.2'))
('The Dark Knight (2008)', Decimal('535.4'))
('Toy Story 4 (2019)', Decimal('434.9'))
('The Lion King (1994)', Decimal('423.6'))
Jika Anda tidak ingin menggunakan LIMITklausa tersebut dan tidak perlu
mengambil semua rekaman, maka objek
tersebut juga cursormemiliki .fetchone()metode :.fetchmany()

 .fetchone()mengambil baris berikutnya dari hasil, sebagai tupel,


atau Nonejika tidak ada lagi baris yang tersedia.
 .fetchmany()mengambil set baris berikutnya dari hasil sebagai daftar
tupel. Ia memiliki sizeargumen, yang secara default adalah 1, yang dapat
Anda gunakan untuk menentukan jumlah baris yang perlu Anda ambil.
Jika tidak ada lagi baris yang tersedia, maka metode tersebut
mengembalikan daftar kosong.

Coba ambil kembali judul lima film terlaris yang dirangkai dengan tahun
perilisannya, tetapi kali ini gunakan .fetchmany():

Ular piton

>>> select_movies_query = """


... SELECT CONCAT(title, " (", release_year, ")"),
... collection_in_mil
... FROM movies
... ORDER BY collection_in_mil DESC
... """
>>> with connection.cursor() as cursor:
... cursor.execute(select_movies_query)
... for movie in cursor.fetchmany(size=5):
... print(movie)
... cursor.fetchall()
...
('Avengers: Endgame (2019)', Decimal('858.8'))
('Titanic (1997)', Decimal('659.2'))
('The Dark Knight (2008)', Decimal('535.4'))
('Toy Story 4 (2019)', Decimal('434.9'))
('The Lion King (1994)', Decimal('423.6'))
Output with .fetchmany()mirip dengan yang Anda terima saat Anda
menggunakan LIMITklausa tersebut. Anda mungkin telah memperhatikan
panggilan tambahan cursor.fetchall()di bagian akhir. Anda melakukan ini
untuk membersihkan semua hasil yang tersisa yang tidak terbaca
oleh .fetchmany().

Perlu untuk membersihkan semua hasil yang belum terbaca sebelum


menjalankan pernyataan lain pada koneksi yang sama. Jika
tidak, InternalError: Unread result foundpengecualian akan dimunculkan.

Menangani Beberapa Tabel Menggunakan JOINPernyataan


Jika Anda merasa pertanyaan di bagian terakhir cukup mudah, jangan khawatir.
Anda dapat membuat SELECTpertanyaan serumit yang Anda inginkan dengan
menggunakan metode yang sama dari bagian terakhir.
Mari kita lihat beberapa JOINkueri yang sedikit lebih rumit . Jika Anda ingin
mengetahui nama lima film dengan rating tertinggi di basis data Anda, maka
Anda dapat menjalankan kueri berikut:

Ular piton

>>> select_movies_query = """


... SELECT title, AVG(rating) as average_rating
... FROM ratings
... INNER JOIN movies
... ON movies.id = ratings.movie_id
... GROUP BY movie_id
... ORDER BY average_rating DESC
... LIMIT 5
... """
>>> with connection.cursor() as cursor:
... cursor.execute(select_movies_query)
... for movie in cursor.fetchall():
... print(movie)
...
('Night of the Living Dead', Decimal('9.90000'))
('The Godfather', Decimal('9.90000'))
('Avengers: Endgame', Decimal('9.75000'))
('Eternal Sunshine of the Spotless Mind', Decimal('8.90000'))
('Beasts of No Nation', Decimal('8.70000'))
Seperti yang ditunjukkan di atas, Night of the Living Dead dan The
Godfather menduduki peringkat teratas sebagai film dengan rating tertinggi
dalam online_movie_ratingbasis data Anda.

Untuk menemukan nama pengulas yang memberi peringkat terbanyak, tulis


kueri berikut:

Ular piton

>>> select_movies_query = """


... SELECT CONCAT(first_name, " ", last_name), COUNT(*) as num
... FROM reviewers
... INNER JOIN ratings
... ON reviewers.id = ratings.reviewer_id
... GROUP BY reviewer_id
... ORDER BY num DESC
... LIMIT 1
... """
>>> with connection.cursor() as cursor:
... cursor.execute(select_movies_query)
... for movie in cursor.fetchall():
... print(movie)
...
('Mary Cooper', 4)
Mary Cooperadalah pengulas yang paling sering dalam basis data ini. Seperti
yang terlihat di atas, tidak masalah seberapa rumit kueri tersebut karena pada
akhirnya kueri tersebut ditangani oleh server MySQL. Proses Anda untuk
menjalankan kueri akan selalu sama: meneruskan kueri
ke cursor.execute()dan mengambil hasilnya menggunakan .fetchall().

Memperbarui dan Menghapus Catatan Dari Basis Data


Di bagian ini, Anda akan memperbarui dan menghapus data dari basis data.
Kedua operasi ini dapat dilakukan pada satu data atau beberapa data dalam
tabel. Anda akan memilih baris yang perlu diubah menggunakan WHEREklausa.

UPDATEMemerintah
Salah satu pengulas dalam basis data Anda, Amy Farah Fowler, kini menikah
dengan Sheldon Cooper. Nama belakangnya kini telah berubah
menjadi Cooper, jadi Anda perlu memperbarui basis data Anda sebagaimana
mestinya. Untuk memperbarui catatan, MySQL
menggunakan UPDATEpernyataan :

Ular piton

update_query = """
UPDATE
reviewers
SET
last_name = "Cooper"
WHERE
first_name = "Amy"
"""
with connection.cursor() as cursor:
cursor.execute(update_query)
connection.commit()
Kode tersebut meneruskan kueri pembaruan ke cursor.execute(),
dan .commit()membawa perubahan yang diperlukan ke reviewerstabel.

Catatan: Dalam UPDATEkueri, WHEREklausa tersebut membantu menentukan


catatan yang perlu diperbarui. Jika Anda tidak menggunakan WHERE, maka
semua catatan akan diperbarui!
Misalkan Anda perlu menyediakan opsi yang memungkinkan pengulas
mengubah peringkat. Pengulas akan memberikan tiga
nilai, movie_id, reviewer_id, dan rating. Kode akan menampilkan rekaman
setelah melakukan modifikasi yang ditentukan.

Dengan asumsi bahwa movie_id = 18, reviewer_id = 15, dan yang


baru rating = 5.0, Anda dapat menggunakan kueri MySQL berikut untuk
melakukan modifikasi yang diperlukan:

Bahasa Indonesia: SQL

UPDATE
ratings
SET
rating = 5.0
WHERE
movie_id = 18 AND reviewer_id = 15;

SELECT *
FROM ratings
WHERE
movie_id = 18 AND reviewer_id = 15;
Kueri di atas pertama-tama memperbarui peringkat dan kemudian
menampilkannya. Anda dapat membuat skrip Python lengkap yang
membangun koneksi dengan basis data dan memungkinkan pengulas untuk
mengubah peringkat:

Ular piton

from getpass import getpass


from mysql.connector import connect, Error

movie_id = input("Enter movie id: ")


reviewer_id = input("Enter reviewer id: ")
new_rating = input("Enter new rating: ")
update_query = """
UPDATE
ratings
SET
rating = "%s"
WHERE
movie_id = "%s" AND reviewer_id = "%s";

SELECT *
FROM ratings
WHERE
movie_id = "%s" AND reviewer_id = "%s"
""" % (
new_rating,
movie_id,
reviewer_id,
movie_id,
reviewer_id,
)

try:
with connect(
host="localhost",
user=input("Enter username: "),
password=getpass("Enter password: "),
database="online_movie_rating",
) as connection:
with connection.cursor() as cursor:
for result in cursor.execute(update_query, multi=True):
if result.with_rows:
print(result.fetchall())
connection.commit()
except Error as e:
print(e)
Simpan kode ini ke berkas bernama modify_ratings.py. Kode di atas
menggunakan %splaceholder untuk memasukkan input yang diterima ke
dalam update_querystring. Untuk pertama kalinya dalam tutorial ini, Anda
memiliki beberapa kueri di dalam satu string. Untuk meneruskan beberapa
kueri ke satu , Anda perlu
menyetel argumencursor.execute() metode ke .multiTrue

Jika , maka multimengembalikan sebuah iterator. Setiap item dalam iterator


sesuai dengan sebuah objek yang mengeksekusi sebuah pernyataan yang
dilewatkan dalam query. Kode di atas menjalankan sebuah loop pada iterator
ini dan kemudian
memanggil setiap objek.Truecursor.execute()cursorfor.fetchall()cursor

Catatan: Menjalankan .fetchall()semua objek kursor itu penting. Untuk


menjalankan pernyataan baru pada koneksi yang sama, Anda harus
memastikan bahwa tidak ada hasil yang belum terbaca dari eksekusi
sebelumnya. Jika ada hasil yang belum terbaca, maka Anda akan menerima
pengecualian.
Jika tidak ada set hasil yang diambil pada suatu operasi,
maka .fetchall()akan muncul pengecualian. Untuk menghindari kesalahan
ini, dalam kode di atas Anda menggunakan cursor.with_rowsproperti, yang
menunjukkan apakah operasi yang terakhir dieksekusi menghasilkan baris.

Meskipun kode ini seharusnya dapat menyelesaikan tujuan Anda, WHEREklausa


tersebut merupakan target utama bagi para peretas web dalam kondisinya saat
ini. Kode ini rentan terhadap apa yang disebut serangan injeksi SQL , yang
dapat memungkinkan pelaku jahat merusak atau menyalahgunakan basis data
Anda.

Peringatan : Jangan coba masukan di bawah ini pada database Anda! Hal itu
akan merusak tabel Anda dan Anda harus membuatnya ulang.
Misalnya, jika pengguna mengirim movie_id=18, reviewer_id=15, dan yang
baru rating=5.0sebagai input, maka outputnya akan terlihat seperti ini:

Kerang

$ python modify_ratings.py
Enter movie id: 18
Enter reviewer id: 15
Enter new rating: 5.0
Enter username: <user_name>
Enter password:
[(18, 15, Decimal('5.0'))]
Dengan dan telah diubah menjadi . Namun jika Anda seorang hacker, maka
Anda mungkin mengirim perintah tersembunyi dalam input
Anda rating:movie_id=18reviewer_id=155.0

Kerang

$ python modify_ratings.py
Enter movie id: 18
Enter reviewer id: 15"; UPDATE reviewers SET last_name = "A
Enter new rating: 5.0
Enter username: <user_name>
Enter password:
[(18, 15, Decimal('5.0'))]
Sekali lagi, output menunjukkan bahwa yang ditentukan ratingtelah diubah
menjadi 5.0. Apa yang berubah?

Peretas menyelinapkan kueri pembaruan saat memasukkan reviewer_id. Kueri


pembaruan, update reviewers set last_name = "A,
mengubah last_namesemua rekaman dalam reviewerstabel menjadi "A". Anda
dapat melihat perubahan ini jika Anda mencetak reviewerstabel:

Ular piton

>>> select_query = """


... SELECT first_name, last_name
... FROM reviewers
... """
>>> with connection.cursor() as cursor:
... cursor.execute(select_query)
... for reviewer in cursor.fetchall():
... print(reviewer)
...
('Chaitanya', 'A')
('Mary', 'A')
('John', 'A')
('Thomas', 'A')
('Penny', 'A')
('Mitchell', 'A')
('Wyatt', 'A')
('Andre', 'A')
('Sheldon', 'A')
('Kimbra', 'A')
('Kat', 'A')
('Bruce', 'A')
('Domingo', 'A')
('Rajesh', 'A')
('Ben', 'A')
('Mahinder', 'A')
('Akbar', 'A')
('Howard', 'A')
('Pinkie', 'A')
('Gurkaran', 'A')
('Amy', 'A')
('Marlon', 'A')
Kode di atas menampilkan first_namedan last_nameuntuk semua rekaman
dalam reviewerstabel. Serangan injeksi SQL merusak tabel ini dengan
mengubah last_namesemua rekaman menjadi "A".

Ada perbaikan cepat untuk mencegah serangan semacam itu. Jangan


tambahkan nilai kueri yang diberikan oleh pengguna secara langsung ke string
kueri Anda. Sebaliknya, perbarui modify_ratings.pyskrip untuk mengirim nilai
kueri ini sebagai argumen ke .execute():

Ular piton

from getpass import getpass


from mysql.connector import connect, Error

movie_id = input("Enter movie id: ")


reviewer_id = input("Enter reviewer id: ")
new_rating = input("Enter new rating: ")
update_query = """
UPDATE
ratings
SET
rating = %s
WHERE
movie_id = %s AND reviewer_id = %s;

SELECT *
FROM ratings
WHERE
movie_id = %s AND reviewer_id = %s
"""
val_tuple = (
new_rating,
movie_id,
reviewer_id,
movie_id,
reviewer_id,
)

try:
with connect(
host="localhost",
user=input("Enter username: "),
password=getpass("Enter password: "),
database="online_movie_rating",
) as connection:
with connection.cursor() as cursor:
for result in cursor.execute(update_query, val_tuple,
multi=True):
if result.with_rows:
print(result.fetchall())
connection.commit()
except Error as e:
print(e)
Perhatikan bahwa %splaceholder tidak lagi berada dalam tanda kutip string.
String yang diteruskan ke placeholder mungkin berisi beberapa karakter
khusus. Jika perlu, karakter ini dapat di-escape dengan benar oleh pustaka
yang mendasarinya.

cursor.execute()memastikan bahwa nilai dalam tuple yang diterima sebagai


argumen adalah tipe data yang dibutuhkan. Jika pengguna mencoba
memasukkan beberapa karakter bermasalah, maka kode akan memunculkan
pengecualian:

Kerang

$ python modify_ratings.py
Enter movie id: 18
Enter reviewer id: 15"; UPDATE reviewers SET last_name = "A
Enter new rating: 5.0
Enter username: <user_name>
Enter password:
1292 (22007): Truncated incorrect DOUBLE value: '15";
UPDATE reviewers SET last_name = "A'
cursor.execute()akan memunculkan pengecualian jika menemukan karakter
yang tidak diinginkan dalam input pengguna. Anda harus menggunakan
pendekatan ini setiap kali Anda memasukkan input pengguna dalam kueri. Ada
cara lain untuk mencegah serangan injeksi SQL juga.

DELETEMemerintah
Menghapus catatan bekerja sangat mirip dengan memperbarui catatan. Anda
menggunakan DELETEpernyataan tersebut untuk menghapus catatan yang
dipilih.

Catatan: Penghapusan adalah proses yang tidak dapat dibatalkan . Jika Anda
tidak menggunakan WHEREklausa tersebut, maka semua rekaman dari tabel
yang ditentukan akan dihapus. Anda perlu menjalankan INSERT INTOkueri lagi
untuk mendapatkan kembali rekaman yang dihapus.
Sebaiknya Anda menjalankan SELECTkueri dengan filter yang sama terlebih
dahulu untuk memastikan bahwa Anda menghapus data yang benar. Misalnya,
untuk menghapus semua peringkat yang diberikan oleh reviewer_id = 2, Anda
harus menjalankan kueri terkait terlebih dahulu SELECT:

Ular piton

>>> select_movies_query = """


... SELECT reviewer_id, movie_id FROM ratings
... WHERE reviewer_id = 2
... """
>>> with connection.cursor() as cursor:
... cursor.execute(select_movies_query)
... for movie in cursor.fetchall():
... print(movie)
...
(2, 7)
(2, 8)
(2, 12)
(2, 23)
Potongan kode di atas menampilkan reviewer_iddan movie_iduntuk rekaman
dalam ratingstabel di mana reviewer_id = 2. Setelah Anda mengonfirmasi
bahwa ini adalah rekaman yang perlu dihapus, Anda dapat
menjalankan DELETEkueri dengan filter yang sama:

Ular piton

delete_query = "DELETE FROM ratings WHERE reviewer_id = 2"


with connection.cursor() as cursor:
cursor.execute(delete_query)
connection.commit()
Dengan kueri ini, Anda menghapus semua peringkat yang diberikan oleh
pengulas reviewer_id = 2dari ratingstabel.

Cara Lain untuk Menghubungkan Python dan MySQL


Dalam tutorial ini, Anda melihat MySQL Connector/Python, yang merupakan
cara resmi yang direkomendasikan untuk berinteraksi dengan database MySQL
dari aplikasi Python. Ada dua konektor populer lainnya:

1. mysqlclient adalah pustaka yang merupakan pesaing dekat konektor


resmi dan secara aktif diperbarui dengan fitur-fitur baru. Karena intinya
ditulis dalam C, ia memiliki kinerja yang lebih baik daripada konektor
resmi Python murni. Kelemahan utamanya adalah ia cukup sulit untuk
disiapkan dan diinstal, terutama pada Windows.

2. MySQLdb adalah perangkat lunak lama yang masih digunakan dalam


aplikasi komersial. Perangkat lunak ini ditulis dalam bahasa C dan lebih
cepat daripada MySQL Connector/Python, tetapi hanya tersedia untuk
Python 2.

Konektor ini berfungsi sebagai antarmuka antara program Anda dan basis data
MySQL, dan Anda mengirimkan kueri SQL melalui konektor tersebut. Namun,
banyak pengembang lebih suka menggunakan paradigma berorientasi
objek daripada kueri SQL untuk memanipulasi data.

Pemetaan relasional objek (ORM) adalah teknik yang memungkinkan Anda


untuk meminta dan memanipulasi data dari basis data secara langsung
menggunakan bahasa berorientasi objek. Pustaka ORM merangkum kode yang
diperlukan untuk memanipulasi data, yang menghilangkan kebutuhan untuk
menggunakan sedikit SQL. Berikut adalah ORM Python yang paling populer
untuk basis data berbasis SQL:

1. SQLAlchemy adalah ORM yang memfasilitasi komunikasi antara Python


dan basis data SQL lainnya. Anda dapat membuat berbagai mesin untuk
berbagai basis data seperti MySQL, PostgreSQL, SQLite, dan sebagainya.
SQLAlchemy umumnya digunakan bersama pustaka pandas untuk
menyediakan fungsionalitas penanganan data yang lengkap.

2. peewee adalah ORM yang ringan dan cepat serta mudah diatur. Ini cukup
berguna jika interaksi Anda dengan basis data terbatas pada
pengambilan beberapa rekaman. Misalnya, jika Anda perlu menyalin
rekaman terpilih dari basis data MySQL ke dalam file CSV, maka peewee
mungkin menjadi pilihan terbaik Anda.

3. Django ORM merupakan salah satu fitur Django yang paling canggih dan
disertakan bersama kerangka web Django. Django ORM dapat
berinteraksi dengan berbagai basis data seperti SQLite, PostgreSQL, dan
MySQL. Banyak aplikasi berbasis Django menggunakan Django ORM
untuk pemodelan data dan kueri dasar, tetapi sering kali beralih ke
SQLAlchemy untuk persyaratan yang lebih kompleks.

Anda mungkin menemukan salah satu pendekatan ini lebih cocok untuk
aplikasi Anda. Jika Anda tidak yakin yang mana yang harus digunakan, maka
sebaiknya gunakan MySQL Connector/Python yang direkomendasikan secara
resmi yang Anda lihat dalam tutorial ini.

Kesimpulan
Dalam tutorial ini, Anda telah melihat cara menggunakan MySQL
Connector/Python untuk mengintegrasikan database MySQL dengan aplikasi
Python Anda. Anda juga melihat beberapa fitur unik dari database MySQL yang
membedakannya dari database SQL lainnya.

Selama proses ini, Anda mempelajari beberapa praktik terbaik pemrograman


yang perlu dipertimbangkan saat membuat koneksi, membuat tabel, serta
memasukkan dan memperbarui rekaman dalam aplikasi basis data. Anda juga
mengembangkan contoh basis data MySQL untuk sistem pemeringkatan film
daring dan berinteraksi dengannya langsung dari aplikasi Python Anda.

Dalam tutorial ini, Anda mempelajari cara:


 Hubungkan aplikasi Python Anda dengan database MySQL
 Membawa data dari database MySQL ke Python untuk analisis lebih
lanjut
 Jalankan kueri SQL dari aplikasi Python Anda
 Menangani pengecualian saat mengakses database
 Mencegah serangan injeksi SQL pada aplikasi Anda

Jika Anda tertarik, Python juga memiliki konektor untuk DBMS lain
seperti MongoDB dan PostgreSQL . Untuk informasi lebih lanjut, lihat Tutorial
Basis Data Python .

Tandai sebagai Selesai

Membagikan

🐍 Trik Python 💌
Dapatkan Trik Python yang singkat dan menarik yang dikirim ke kotak masuk
Anda setiap beberapa hari. Tidak pernah ada spam. Berhenti berlangganan
kapan saja. Dikurasi oleh tim Real Python.

Kirimkan Saya Trik Python »

Tentang Chaitanya Baweja

Chaitanya adalah seorang Pythonista yang rajin dan menulis untuk Real Python.

» Lebih lanjut tentang Chaitanya

Setiap tutorial di Real Python dibuat oleh tim pengembang sehingga memenuhi
standar kualitas tinggi kami. Anggota tim yang mengerjakan tutorial ini adalah:
Kuasai Keterampilan Python di Dunia Nyata dengan Akses Tak Terbatas ke
Python Asli

Bergabunglah dengan kami dan dapatkan akses ke ribuan tutorial, kursus video
langsung, dan komunitas ahli Pythonista:

Tingkatkan Keterampilan Python Anda »


Bagaimana menurutmu?
Nilai artikel ini:

LinkedInTwitterLangit biruIndonesiaE-mail

Apa hal terpenting atau hal favorit yang Anda pelajari? Bagaimana Anda akan
menggunakan keterampilan baru Anda? Tinggalkan komentar di bawah dan
beri tahu kami.

Kiat Berkomentar: Komentar yang paling bermanfaat adalah komentar yang


ditulis dengan tujuan untuk belajar dari atau membantu siswa lain. Dapatkan
kiat untuk mengajukan pertanyaan yang bagus dan dapatkan jawaban atas
pertanyaan umum di portal dukungan kami .

Mencari percakapan langsung? Kunjungi Obrolan Komunitas Real Python atau


bergabunglah dengan Sesi Tanya Jawab Langsung “Office Hours” berikutnya .
Selamat Belajar Python!

Terus belajar
Topik Terkait: intermediat basis data ilmu data

Tutorial Terkait:
 Lingkungan Virtual Python: Pengantar
 Kelas Python: Kekuatan Pemrograman Berorientasi Objek
 Pengantar Pustaka SQL Python
 Langkah Pertama Anda Dengan Django: Menyiapkan Proyek Django
 Bangun Proyek Web Flask yang Dapat Diskalakan dari Awal

Hapus iklan

⋅ Newsletter ⋅ Podcast ⋅ YouTube ⋅ Twitter ⋅ Facebook ⋅ Instagram ⋅ Tutorial


© 2012–2024 Real Python

Python ⋅ Pencarian ⋅ Kebijakan Privasi ⋅ Kebijakan Energi ⋅ Beriklan ⋅ Kontak


Selamat Menggunakan Python!

Anda mungkin juga menyukai