Chapter 14

Basic CURD with Python

ကျွန်တော်တို့ MySQL ကို python program တစ်ခု ရေးရအောင်။ အရင်ဆုံး mysql adapter ရှိမရှိ စမ်းကြည့်ရအောင်။

$ python
>>> import mysql.connector

အကယ်၍ ဘာ error မှ မရှိရင်တော့ mysql နှင့် python ကို သုံးလို့ရပါပြီ။ Error ဖြစ်ခဲ့ရင်တော့ https://dev.mysql.com/downloads/connector/python/ မှာ python connector ကို download ချနိုင်ပါတယ်။

MySQL Connectivity

အခု ကျွန်တော်တို့တွေ sampleProj ဆိုပြီး folder ဆောက်လိုက်ပါမယ်။ sampleProj အောက်မှာ test.py ဆိုပြီး folder အောက်မှာ ဆောက် ဖို့ လိုပါတယ်။

test.py

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="myschool"
)

print(mydb)

ကျွန်တော်ကတော့ database ကို username root နဲ့ password root လို့ ပေးထားလို့ပါ။ လက်ရှိ ကိုယ်သုံးနေသည့် root password ကို ထည့်ပြီးတော့ စမ်းကြည့်ပါ။ database ကတော့ myschool ကို အသုံးပြုထားပါတယ်။

$python3 test.py

ဆိုရင်

<mysql.connector.connection_cext.CMySQLConnection object at 0x7fe64be60640>

SELECT Data

အခု test.py မှာ ဆက်ပြီးတော့ database ဆောက်သည့် code ရေးကြည့်ရအောင်။

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="myschool"
)

mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM students")

myresult = mycursor.fetchall()

mycursor.close()
mydb.close()

for x in myresult:
  print(x)

အဲဒီ code ကို run လိုက်ရင်

(1, 'Mg Mg', 'CS_101', datetime.datetime(2020, 10, 14, 0, 14, 6))
(2, 'Aung Gyi', 'CS_101', datetime.datetime(2020, 10, 14, 0, 14, 6))
(3, 'Yang Aung', 'CS_101', datetime.datetime(2020, 10, 14, 0, 14, 6))
(4, 'Kyaw Kyaw', 'CS_102', datetime.datetime(2020, 10, 14, 0, 14, 6))
(5, 'Moe Moe', 'CS_102', datetime.datetime(2020, 10, 14, 0, 14, 6))
(6, 'Zu Zu', None, datetime.datetime(2020, 10, 14, 0, 14, 6))
(7, 'Gone Tint', None, datetime.datetime(2020, 10, 14, 0, 14, 6))
(8, 'Kyaw Myint', None, datetime.datetime(2020, 10, 14, 0, 27, 43))
(9, 'Moe Aung', None, datetime.datetime(2020, 10, 14, 0, 27, 43))

ဆိုပြီး ထွက်လာပါမယ်။

mycursor.fetchall() က SELECT * FROM students query က ရလာသည့် result တွေ အကုန် ဆွဲထုတ်လိုက်တာပါ။

အကယ်၍ အပေါ် ဆုံး တစ်ခုပဲ ထုတ်ချင်ရင်တော့ mycursor.fetchone() ကို သုံးနိုင်ပါတယ်။

myresult = mycursor.fetchone()
print(myresult)
mycursor.close()
mydb.close()

mysql ကို သုံးသည့် အခါမှာ လိုအပ်သည့် data တွေ ရပြီးပါက connection ကို ပြန်ပိတ်သင့်ပါတယ်။ သို့မှသာ memory resource အသုံးပြုတာတွေ သက်သာ ပါလိမ့်မယ်။ ပုံမှန် project အသေးလေးတွေ မှာ မသိသာ ပေမယ့် project ကြီးလာရင် သိသာပါလိမ့်မယ်။

အခု Where နဲ့ စစ်ကြည့်ရအောင်။

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="myschool"
)

mycursor = mydb.cursor()
mycursor.execute("SELECT name,dep_code FROM students WHERE name like '%Aung%'")

myresult = mycursor.fetchall()

mycursor.close()
mydb.close()

for res in myresult:
  print("NAME : " ,res[0])
  print("DEP Code : " ,res[1])
  print("---")

students table ထဲ က name မှာ Aung ပါသည့် ကျောင်းသားတွေကို ဆွဲ ထုတ်တာပါ။ code ကို run လိုက်ရင် database ထဲမှာ ရှိသည့် data တွေကို ထုတ်ပြပါလိမ့်မယ်။

NAME :  Aung Gyi
DEP Code :  CS_101
---
NAME :  Moe Aung
DEP Code :  None
---
NAME :  Yang Aung
DEP Code :  CS_101
---

code ကို အနည်းငယ် ပြင်ပါမယ်။

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="myschool"
)

mycursor = mydb.cursor()
mycursor.execute("SELECT name,dep_code FROM students WHERE name like %s",("%Aung%",))

myresult = mycursor.fetchall()

mycursor.close()
mydb.close()

for res in myresult:
  print("NAME : " ,res[0])
  print("DEP Code : " ,res[1])
  print("---")

အခု code မှာ ဆိုရင် Aung ကို sql ထဲမှာ တိုက်ရိုက် မသုံးတော့ပဲ %s နဲ့ parameter pass လုပ်ထားပါတယ်။ execute လုပ်ချိန်မှာ parameter ကို tuple နဲ့ ထည့်ပေးရပါမယ်။

အခု id နဲ့ ထပ်ပြီးတော့ ထုတ်ကြည့်ရအောင်။

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="myschool"
)

mycursor = mydb.cursor()
mycursor.execute("SELECT name,dep_code FROM students WHERE student_id = %s",("9",))

myresult = mycursor.fetchall()

mycursor.close()
mydb.close()

for res in myresult:
  print("NAME : " ,res[0])
  print("DEP Code : " ,res[1])
  print("---")

အခု ဆိုရင် student_id 9 ဖြစ်သည့် ကျောင်းသား တစ်ယောက်တာ ထွက်လာပါလိမ့်မယ်။

parameter pass လုပ်ခြင်းဟာ sql injection ကို ကာကွယ်ပြီး သား ဖြစ်ပါတယ်။ parameter pass မလုပ်ပဲ တိုက်ရိုက် သုံးခြင်းဟာ အန္တရာယ်များပြီး sql injection ပြုလုပ်လို့ ရစေနိုင်ပါတယ်။

INSERT Data

အခု INSERT အတွက် ရေးကြည့်ရအောင်။

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="myschool"
)

mycursor = mydb.cursor()

sql = "INSERT INTO students (name, dep_code) VALUES (%s, %s)"
val = ("John", "CS_102")
mycursor.execute(sql, val)

mydb.commit()

print(mycursor.rowcount, "record inserted.")

mycursor.close()
mydb.close()

INSERT ပြုလုပ်သည့် အခါမှာတော့ value တွေကို execute ပြုလုပ်သည့် အခါမှာ tuple နဲ့ ပဲ pass လုပ်ထားပါတယ်။

code ကို run လိုက်ရင် students table မှာ John, CS_102 အနေဖြင့် ထည့်လိုက်ခြင်း ဖြစ်သည်။ 1 record inserted. ဆိုပြီး ပြပါမယ်။

အကယ်၍ multiple row insert ပြုလုပ်လိုပါက အောက်ပါ အတိုင်း ပြုလုပ်နိုင်ပါတယ်။

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="myschool"
)

mycursor = mydb.cursor()

sql = "INSERT INTO students (name, dep_code) VALUES (%s, %s)"
val = [
    ("Joe", "CS_102"),
    ("Set", "CS_101"),
    ("Mona", "CS_102"),
    ("Lisa", "CS_101")
]
mycursor.executemany(sql, val)

mydb.commit()

print(mycursor.rowcount, "record inserted.")

mycursor.close()
mydb.close()

execute အစား executemany ကို သုံးထားတာကို တွေ့ရပါလိမ့်မယ်။ Value တွေကိုတော့ array ထဲမှာ ထည့်ပြီး တော့ executemany row ၄ ခု ကို ထည့်သွားပါတယ်။

code ကို run လိုက်ရင် 4 record inserted. ဆိုပြီး တွေ့နိုင်ပါတယ်။

UPDATE Data

INSERT ပြုလုပ်ပြီးပြီ ဆိုတော့ update လုပ်ကြည့်ရအောင်။

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="myschool"
)

mycursor = mydb.cursor()
mycursor.execute("UPDATE students SET name = %s WHERE student_id = %s",("Ko Oo","9"))

mydb.commit()

print(mycursor.rowcount, "record updated.")

mycursor.close()
mydb.close()

အခု code ဟာ student_id ဟာ 9 ဖြစ်သည့် name ကို Ko Oo ဆိုပြီး update လုပ်လိုက်ခြင်း ဖြစ်ပါတယ်။

DELETE Data

DELETE ကလည်း INSERT လိုမျိုး execute , commit လုပ်ရုံပါပဲ။

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="root",
  database="myschool"
)

mycursor = mydb.cursor()
mycursor.execute("DELETE FROM students WHERE student_id = %s",("9",))

mydb.commit()

print(mycursor.rowcount, "record deleted.")

mycursor.close()
mydb.close()

အခု code လေးကို run လိုက်ရင် student_id ဟာ 9 ဖြစ်သည့် row ကို ဖျက်လိုက်မှာ ဖြစ်ပါတယ်။

အခု code တွေကို ပြန်ပြီး ကြည့်လိုက်ရင် data ဆွဲထုတ်မယ်ဆိုရင် execute , fetchall ကို သုံးပြီး data တွေကို ထည့်မယ် ၊ ဖျက်မယ်​ ၊ ပြင်မယ် ဆိုရင် execute , commit လုပ်ရုံပါပဲ။