Welcome

Welcome to My Blog

Sunday, 26 March 2017

MEMASUKKAN DATA CSV KE DATABASE MYSQL MELALUI PYTHON






Dalam artikel kali ini, saya akan membahas bagaimana cara memasukkan data ke tabel MySQL melalui Python, mulai dari cara mengkoneksikan Python ke MySQL hingga memasukkan data-data yang telah dibuat ke MySQL melalui Python dengan GUI Tkinter.
Sebelum mulai, MySQL dan Python 2.7 harus sudah terinstall dalam PC anda. Jika belum, anda dapat mendownloadnya di link berikut ini.

Python 2.7.13:

MySQL Community:

Saat anda menginstall MySQL, maka anda akan diminta mengisi username dan password, nantinya username dan password ini akan kita pakai untuk mengkoneksikan Python dan MySQL.
Setelah Python dan MySQL sudah terinstall, maka langkah selanjutnya adalah membuat database dan tabel pada MySQL, pada artikel kali ini saya akan membuat database tentang Dota 2 dengan tabel hero dan abilities. Disini saya anggap pembaca sudah mengerti bagaimana membuat database dan tabel pada MySQL, jadi saya akan langsung lompat ke database saya. Berikut database dota2 yang telah saya buat pada MySQL Command Line Client.

Setelah membuat database dan tabel di MySQL, kita akan membuat sekumpulan data yang akan dibaca oleh python dan menghubungkannya dengan MySQL. Data yang dibuat adalah data yang berekstensi .csv (Comma Separated Values). Untuk membuat file .csv ini, saya menggunakan microsoft excel. Berikut data untuk tabel abilities yang telah saya buat.





Setelah mengetikkan data di microsoft excel, klik save as, lalu pada kolom “save as type” pilih format CSV (Comma delimited) (*.csv).


Barulah kita dapat memulai program pada Pythonnya. Berikut adalah link full code yang telah saya buat.


Pertama kita import semua module yang diperlukan

from Tkinter import *
import mysql.connector
import csv, sys
import tkFileDialog

Kita membuat exception handling untuk koneksi ke MySQL dengan try dan except. Pastikan anda memasukkan nama user dan password MySQL anda dengan benar, untuk host, karena disini saya hanya mengkoneksikan dengan MySQL yang berada di PC saya, maka saya gunakan localhost.

try:
    conn=mysql.connector.connect(user='root', password='24Ka103li98sapnjri', host='localhost', database='dota2')
except mysql.connector.Error as err:
  if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
    print("Invalid username or password")
  elif err.errno == errorcode.ER_BAD_DB_ERROR:
    print("Database does not exist")
  else:
    print(err)

Lalu, semua code yang berada di dalam class Application(Frame), adalah code untuk GUI dan fungsi-fungsinya.
Di dalam createWidgets anda dapat membuat label, button, dan interface lainnya. Disini saya menggunakan fungsi grid() untuk menempatkan interface pada windows.
Pada bagian __init__ memanggil class createWidgets dan fungsi pack() untuk widgets GUI ini.

    def createWidgets(self):
       
        self.lbl_title = Label(self, text="Dota 2 Insert  Databases", fg="#fff", bg="#007", padx="20px", pady="8px", font=("Times New Roman", 18))
        self.lbl_hero = Label(self, text="Choose .csv file for hero data", fg="#fff", bg="#828282", padx="10px", pady="6px", font=("Times New Roman", 12))
        self.btn_hero = Button(self, text='Browse', width=8, height=2, command=self.openHeroFile)

        self.lbl_title.grid(row=0, column=0, columnspan=3, sticky=N+E+W)
        self.lbl_hero.grid(row=1, column=0,sticky=W)
        self.btn_hero.grid(row=2, column=0)

    #Initialize
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

Didalam def openHeroFile(self): , adalah program utama untuk memasukkan data-data dari .csv yang kita buat ke dalam MySQL database.

        filename = tkFileDialog.askopenfilename(filetypes = (("Template files", "*.csv"), ("All files", "*")))

Code diatas adalah untuk membuat sebuah command untuk memilih file dari directories kita.
Setelah itu, kita buat code untuk membaca setiap baris yang ada pada file .csv kita.

with open(filename, 'rb') as f:
            reader = csv.reader(f)

Kita buat try and except lagi karena ada kemungkinan error dalam pembacaan filenya. Lalu kita uraikan data-data dari .csv yang telah kita buat. Karena data-data yang ada pada .csv terpisah oleh tanda ‘;’ maka kita harus menggunakan fungsi split(‘;’) untuk memisahkan data-datanya.
Setelah itu kita harus membuat data-data tersebut menjadi string dengan menggunakan perintah str(). Lalu kita buat perintah command yang akan dieksekusi MySQL. Disini saya ingin membuat dua buah kondisi, jika ID belum ada di dalam tabel, maka kita gunakan perintah “insert into”, tetapi jika ID sudah ada di dalam tabel, maka kita gunakan perintah “update”.

try:
                for row in reader:
                    data = row[0].split(';')
                    hero_id = str(data[0])
                    hero_name = str(data[1])
                    print("hero_id = " + hero_id)
                    print("hero_name = " + hero_name)
                    cmd = "select hero_id from hero where hero_id = {};".format(hero_id)
                    cursor = conn.cursor()
                    cursor.execute(cmd, hero_id)
                    recordExist = 0
                    for r_row in cursor:
                        recordExist = 1
                    if recordExist == 1:
                        cmd = "update hero set hero_name=%s where hero_id=%s;"
                        cursor.execute(cmd, (hero_name, hero_id))
                    else:
                        cmd = "insert into hero values(%s, %s);"
                        cursor.execute(cmd, (hero_id, hero_name))
                   
                conn.commit()
                cursor.close()
                conn.close()
                   
            except csv.Error as e:
                sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))

Terakhir, kita memanggil class Application yang telah kita buat, dan kita buat aplikasi tersebut terus mengulang dengan perintah .mainloop(). Lalu jika aplikasi sudah selesai digunakan, kita destroy dengan perintah .destroy().
Karena sebelumnya kita telah membuka koneksi Python dengan MySQL, maka yang harus dilakukan saat sudah selesai menggunakan aplikasi adalah dengan menutup koneksinya, yaitu dengan perintah .close().

root = Tk()
root.resizable(width=False, height=False)
root.title("Dota 2 Insert Databases")
app = Application(master=root)
app.mainloop()
conn.close()
root.destroy()

Jika kita run full code yang telah saya berikan diatas, maka hasilnya akan seperti berikut.


Anda tinggal menekan tombol Browse dan pilih file .csv yang telah anda buat, maka otomatis data-data yang ada dalam file .csv tersebut akan dimasukkan ke dalam tabel database MySQL yang telah dibuat sebelumnya (dalam hal ini, database=dota2).

No comments:

Post a Comment