PyMySQL (Pythonda MySQL) - O'zbekcha
PyMySQL (Pythonda MySQL) - O'zbekcha
PyMySQL
ABBOSBEK IBRAGIMOV 1
@python_uzbek_coder PyMySQL
MUNDARIJA
2. Pythonda MySQL……………......……………………………………….... 4
ABBOSBEK IBRAGIMOV 2
@python_uzbek_coder PyMySQL
MySQL — juda katta tezlikda ishlovchi va qulay hisoblanadi. Bu tizimda ishlash juda
sodda va uni o'rganish qiyinchilik tug'dirmaydi. MySQL tizimi tcx kompaniyasi tomonidan,
ma'lumotlarni tez qayta ishlash uchun korxona miqyosida ishlatishga yaratilgan. Keyinchalik
ommalashib, saytlarning asosiy bazasi sifatida yoyildi.
So'rovlar SQL tili orqali amalga oshiriladi. Bu MBBT relyatsion ma'lumotlar baza hisoblanadi.
Bu degani baza jadvallar, jadvallar esa ustunlardan tashkil topgandir.
MySQL MBBTi 2 xil turdagi litsenziyaga ega. Birinchisi tekin, ya'ni MYSQLni ko'chirib
olish va ishlatish hech qanday harajat talab qilmaydi va GPL(GNU Public Licenseb, GNU)
litsenziyasiga asoslanadi. Ikkinchi turi, GPL shartiga ko'ra, agar siz MySQL kodlarini biror
dasturingizda ishlatsangiz, bu dasturingiz ham GPL(tekin) bo'lishi kerak. Bu esa dasturchiga
to'g'ri kelmaydi. Shuning uchun, bu dasturingizni pullik qilishingiz uchun MySQL pullik
litsenziyasini sotib olishingiz kerak. MySQL logotipi delfin hisoblanadi. Bu delfinni ismi
«Sakila»dir. Bu logotipni OpenSource tuzuvchilaridan biri Ambrose Twebaze ga tegishlidir.
MySQL juda ko'p operatsion tizimlar bilan ishlay oladi. Bularni yozadigan bo'lsam: AIX,
BSDi, FreeBSD, HP-UX, Linux, Mac OS X, NetBSD, OpenBSD, OS/2 Warp, SGI
IRIX, Solaris, SunOS, UnixWare, Windows 95, Windows 98, Windows NT,
Windows 2000, Windows XP, Windows Server 2000, Windows Vista, Windows
7,…
MySQL shved korxonasi MySQl AB ga tegishli bo'lgan, keyinchalik SUN firmasi MySQL
ni o'ziniki qilib olgan. Bir necha yil oldin esa, gigant korxonalardan biri Oracle, SUN
firmasini sotib oldi va hozirda MySQL Oracle firmasi mahsuloti sifatida chiqib kelmoqda.
Bu bir hisobda Microsoft SQL Server ga katta raqobatdosh ekanligini anglatadi.
MySQL bir necha serverlarning bir qismi hisoblanadi. Misol uchun, WAMP, AppServ,
LAMP, Denwer,… Kliyentlar MySQL serveriga ma'lum bir kutubxonalar orqali ulanadi.
MySQL ga quyidagi dasturlash tillari ulanib ishlashi mumkin: Delphi, C, C++, Java,
Perl, Php, Python, Ruby va boshqalar.
ABBOSBEK IBRAGIMOV 3
@python_uzbek_coder PyMySQL
Pythonda MySQL
Python dasturlarida ma’lumotlar bazasi ishlatilishi mumkin. Eng mashhur ma'lumotlar bazalaridan biri bu MySQL.
Ushbu qo'llanmada berilgan kod misollari bilan tajriba o'tkazish uchun kompyuteringizda MySQL o'rnatilgan bo'lishi kerak.
Bepul MySQL ma'lumotlar bazasini https://www.mysql.com/downloads/ saytidan yuklab olishingiz mumkin.
Pythonga MySQL ma'lumotlar bazasiga kirish uchun MySQL drayveri kerak. Ushbu qo'llanmada biz "MySQL Connector"
drayveridan foydalanamiz. "MySQL Connector" ni o'rnatish uchun PIP-dan foydalanishni tavsiya etamiz. PIP, ehtimol
sizning Python muhitingizda o'rnatilgan bo'lishi ham mumkin.
MySQL Connector ni o’rnatish uchun buyruqlar satri ya’ni cmd da PIP joylashgan joyga o'ting va quyidagilarni kiriting:
Bu buyruqni cmd da kiritganingizgan so’ng siz endi MySQL drayverini yuklab olgan va o’rnatgan hisoblanasiz !!!
O'rnatish muvaffaqiyatli bo'lganligini yoki "MySQL Connector" o'rnatilganligini tekshirish uchun quyidagi tarkibga ega
Python sahifasini yarating:
import mysql.connector
# agar ushbu sahifa xatolarsiz bajarilgan bo'lsa, sizda "mysql.connector" moduli o'rnatilgan.
Agar yuqoridagi kod xatosiz bajarilgan bo'lsa, "MySQL Connector" o'rnatilgan va foydalanishga tayyor.
Demak endi ma'lumotlar bazasiga ulanishni yaratamiz. Bunda MySQL ma'lumotlar bazangizdan foydalanuvchi nomi va
paroldan foydalaning va quyidagilarni python fayliga kiriting:
import mysql.connector
ABBOSBEK IBRAGIMOV 4
@python_uzbek_coder PyMySQL
Natija:
Bunda foydalanuvchi nomi va parolga o’zingiz xoxlagan nomdan foydalanishingi mumkin. Demak biz ma’lumotlar bazasi
bilan aloqani o’rnatdik. Endi siz ma'lumotlar bazasi ustida SQL operatorlari yordamida so’rovlarni amalga oshirib bemalol
ish olib borishingiz mumkin.
Misol
import mysql.connector
mydb = mysql.connector.connect( host="localhost", user="myusername", passwd="mypassword" )
mycursor = mydb.cursor() mycursor.execute("CREATE DATABASE mydatabase")
Agar yuqoridagi kod xatosiz bajarilgan bo'lsa, siz ma'lumotlar bazasini muvaffaqiyatli yaratgan bo’lasiz.
Ma'lumotlar bazasi mavjudligini tizimdagi barcha ma'lumotlar bazalarini ro'yxatlash orqali ya’ni "SHOW DATABASES"
iborasi yordamida tekshirishingiz mumkin:
Misol
import mysql.connector
mycursor.execute("SHOW DATABASES")
for x in mycursor:
print(x)
ABBOSBEK IBRAGIMOV 5
@python_uzbek_coder PyMySQL
Natija:
Yoki buni boshqacha usuli ulanishda ma'lumotlar bazasiga kirishga urinib ko'rishimiz mumkin:
Misol:
import mysql.connector
# Agar bu sahifa xatosiz bajarilgan bo'lsa, "mydatabase" ma'lumotlar bazasi "tizimingizda mavjud
Agar ma'lumotlar bazasi mavjud bo'lmasa, siz xatoga yo'l qo'ygan bo’lasiz.
Jadval yaratish
MySQL-da jadval yaratish uchun "CREATE TABLE" iborasidan foydalaniladi. Bunda jadvalni yaratishda ma'lumotlar bazasi
nomi aniq yozilganligiga ishonch hosil qiling.
Misol
import mysql.connector
mycursor = mydb.cursor()
#Agar ushbu sahifa xatosiz bajarilgan bo'lsa, siz " mijozlar "nomli jadvalni muvaffaqiyatli yaratdingiz.
Agar yuqoridagi kod xatosiz bajarilgan bo'lsa, endi siz jadvalni muvaffaqiyatli yaratdingiz.
ABBOSBEK IBRAGIMOV 6
@python_uzbek_coder PyMySQL
Ma'lumotlar bazangizdagi barcha jadvallarni "SHOW TABLES" iborasi bilan ro'yxatlash orqali jadval mavjudligini
tekshirishingiz mumkin:
Misol
import mysql.connector
mycursor = mydb.cursor()
mycursor.execute("SHOW TABLES")
for x in mycursor:
print(x)
Natija:
('customers',)
Yuqoridagi natijada demak bizning ma’lumotlar bazamizda bitta customers nomli jadval mavjudligi haqida xabar chiqarildi.
Jadvalni yaratishda, shuningdek, har bir yozuv uchun noyob kalit bilan ya’ni qaytarilmas id ustun yaratishingiz kerak. Buni
PRIMAR KEY ni aniqlash orqali amalga oshirish mumkin. Biz har bir yozuv ya’ni jadvaldagi har bir qator uchun qaytarilmas
noyob raqam kiritadigan "INT AUTO_INCREMENT PRIMARY KEY" iborasidan foydalanamiz. Bunda id qaytarilmas raqam
1 dan boshlab, har bir yozuv ya’ni qator uchun bittadan oshib ketuvchi takrorlanmas kalit ustun hosil bo’ladi.
Misol
import mysql.connector
mycursor = mydb.cursor()
mycursor.execute("CREATE TABLE customers (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255),
address VARCHAR(255))")
# Agar ushbu sahifa xatosiz bajarilgan bo'lsa," mijozlar "jadvali endi asosiy kalitga ega
ABBOSBEK IBRAGIMOV 7
@python_uzbek_coder PyMySQL
Agar jadval allaqachon mavjud bo'lsa, ALTER TABLE kalit so'zidan foydalaning:
Misol
import mysql.connector
#Agar ushbu sahifa xatosiz bajarilgan bo'lsa," mijozlar "jadvalida endi asosiy kalit mavjud
Misol
import mysql.connector
mydb = mysql.connector.connect( host="localhost", user="myusername", passwd="mypassword",
database="mydatabase" )
mycursor = mydb.cursor()
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("John", "Highway 21")
mycursor.execute(sql, val)
mydb.commit()
Natija:
1 ta yozuv kiritildi
Muhim ! : Ushbu bayonotga e’tibor bering: mydb.commit(). Commit() funksiyasi ma’lumotlar bazasiga
o’zgarishlarni kiritishni talab qiladi, aks holda jadvalga o’zgartirishlar kiritilmaydi.
ABBOSBEK IBRAGIMOV 8
@python_uzbek_coder PyMySQL
Jadvalga bir nechta qatorlar ma’lumotlarni kiritish uchun executemany () funksiyasidan foydalaniladi. Bunda
executemany() funksiyasining ikkinchi parametri siz kiritmoqchi bo'lgan ma'lumotlarni o'z ichiga olgan kataklar ro'yxati ya’ni
quyidagi misolimizda val o’zgaruvchisi hisoblanadi.
Misol
"Customers" jadvalini ma'lumotlar bilan to'ldiramiz:
import mysql.connector
mycursor.executemany(sql, val)
mydb.commit()
Natija:
13 ta yozuv kiritildi.
Izoh: Agar bitta qatorni ko’proq qo’shsangiz, bunda oxirgi kiritilgan satrning id-si qaytariladi.
Misol
import mysql.connector
ABBOSBEK IBRAGIMOV 9
@python_uzbek_coder PyMySQL
Natija:
1 ta yozuv kiritildi, ID: 15
Misol
import mysql.connector
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM customers")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
Natija:
Izoh: Biz yuqoridagi misolimizda barcha qatordagi ma’lumotlarni olib kelish uchun ximat qiladigan fetchall()
funksiyasidan foydalandik.
Jadvaldagi faqat bir qator ustunlarni tanlash uchun "SELECT" iborasidan so'ng ustun nom (lar) i ishlatiladi:
Misol
import mysql.connector
mycursor = mydb.cursor()
mycursor.execute("SELECT name, address FROM customers")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
Natija:
Agar sizga faqat bitta qator qiziq bo'lsa, fetchone () usulidan foydalanishingiz mumkin.
ABBOSBEK IBRAGIMOV 11
@python_uzbek_coder PyMySQL
Misol
import mysql.connector
print(myresult)
Natija:
Ko’rib turganingizdek fetchone() funksiyasi bizga faqat bitta qator ma’lumotlarni qaytardi.
Jadvaldan ma’lumotlarni tanlab olishda, "WHERE" iborasi yordamida tanlovni filtrlashingiz mumkin. Ya’ni bunda filtrlash
orqali tanlab olish deganda ma’lumotning faqat bizning shartlarimizga oid bo’lgan ma’lumotlarni tanlab olish tushuniladi.
Misol
import mysql.connector
myresult = mycursor.fetchall()
for x in myresult:
print(x)
ABBOSBEK IBRAGIMOV 12
@python_uzbek_coder PyMySQL
Natija:
Demak bizga yuqoridagi kod haqiqatdan ham manzili “Park Lane 38” bo’lgan ma’lumotlar ustunini qaytardi.
Biz jadvallardan ma’lumotlarni tanlab olayotganimizda ma'lum bir harf yoki ibora bilan boshlanadigan, o'z ichiga olgan yoki
tugaydigan yozuvlarni ham tanlab olishimiz mumkin. Bunda bunday tanlashlarni amalga oshirish uchun uchun % dan
foydalanamiz.
Misol
import mysql.connector
myresult = mycursor.fetchall()
for x in myresult:
print(x)
Natija:
Demak yuqoridagi kod bizga manzilida “way” ya’ni yo’l so’zi qatnashgan ma’lumotlar ustuni chiqarib berdi. Agar biz so’rovni
“%way” holatida bergamizmizda bizga manzili “way” so’zi bilan tugaydigan ma’lumotlar ustuni, “way%” holatida
berganimizda esa bizga manzili “way” so’zi bilan boshlanadigan ma’lumotlar ustunini qaytarar edi.
Agar so'rov qiymatlari foydalanuvchi tomonidan taqdim etilsa, siz qiymatlardan qochishingiz kerak. Bu ma'lumotlar bazasini
yo'q qilish yoki suiste'mol qilish uchun keng tarqalgan veb-xakerlik texnikasi bo'lgan SQL in'ektsiyalarining oldini olish uchun
zarur hisoblanadi.
ABBOSBEK IBRAGIMOV 13
@python_uzbek_coder PyMySQL
Misol
import mysql.connector
sql = "SELECT * FROM customers WHERE address = %s" adr = ("Yellow Garden 2", )
mycursor.execute(sql, adr)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
Natija:
Natijalarni saralash
MySQL-da natijani o'sish yoki kamayish tartibida saralash uchun ORDER BY operatoridan foydalaniladi. ORDER BY kalit
so'zi sukut bo'yicha natijani o’sish bo’yicha saralaydi. Natijani kamayish tartibida saralash uchun esa DESC kalit so'zidan
foydalaniladi.
Misol
import mysql.connector
myresult = mycursor.fetchall()
for x in myresult:
print(x)
ABBOSBEK IBRAGIMOV 14
@python_uzbek_coder PyMySQL
Natija:
Misol
import mysql.connector
myresult = mycursor.fetchall()
for x in myresult:
print(x)
Natija:
Mavjud jadvaldagi ma’lumotlarni "DELETE FROM" iborasi yordamida o'chirib tashlashingiz mumkin:
Misol
import mysql.connector
mydb.commit()
Natija:
1 ta yozuv o'chirildi
DELETE sintaksisidagi WHERE bandiga e'tibor bering: WHERE bandida qaysi ma’lumot (lar) o'chirilishi kerakligi
ko'rsatilgan. Agar "WHERE" bandini tashlab ketsangiz, jadvaldagi barcha ma’lumotlar o'chiriladi!
Har qanday so'rovning qiymatlaridan, shuningdek, o'chirish bayonotlaridan qochish yaxshi amaliyot deb hisoblanadi.
Bu ma'lumotlar bazasini yo'q qilish yoki suiste'mol qilish uchun keng tarqalgan veb-xakerlik texnikasi bo'lgan SQL
in'ektsiyalarining oldini olish uchun zarur hisoblanadi.
Mysql.connector moduli o'chirish bayonotidagi qiymatlardan qochish uchun % s plomba vositasidan foydalanadi.
ABBOSBEK IBRAGIMOV 16
@python_uzbek_coder PyMySQL
Misol
import mysql.connector
sql = "DELETE FROM customers WHERE address = %s" adr = ("Yellow Garden 2", )
mycursor.execute(sql, adr)
mydb.commit()
Natija:
1 ta yozuv o'chirildi
Jadvalni o'chirish
MySQL – da mavjud bo’lgan jadvalni "DROP TABLE" iborasi yordamida o'chirib tashlashingiz mumkin.
Misol
import mysql.connector
#Agar ushbu sahifa hech qanday xatosiz bajarilgan bo'lsa, siz "mijozlar" jadvalini muvaffaqiyatli o'chirib tashladin
giz.
Agar o'chirmoqchi bo'lgan jadval allaqachon o'chirilgan bo'lsa yoki boshqa biron sababga ko'ra mavjud bo'lmasa, xatoga
yo'l qo'ymaslik uchun IF EXISTS kalit so'zidan foydalanishingiz mumkin.
ABBOSBEK IBRAGIMOV 17
@python_uzbek_coder PyMySQL
Misol
import mysql.connector
#Agar ushbu sahifa hech qanday xatosiz bajarilgan bo'lsa, siz" mijozlar "jadvalini muvaffaqiyatli o'chirib tashladin
giz
Jadvallarni yangilash
Misol
"Valley 345" dan "Canyoun 123" gacha bo'lgan manzil ustunini qayta yozamiz:
import mysql.connector
sql = "UPDATE customers SET address = 'Canyon 123' WHERE address = 'Valley 345'"
mycursor.execute(sql)
mydb.commit()
Natija:
1 ta yozuv o’zgartirildi
Muhim ! : Ushbu bayonotga e’tibor bering: mydb.commit(). Commit() funksiyasi ma’lumotlar bazasiga
o’zgarishlarni kiritishni talab qiladi, aks holda jadvalga o’zgartirishlar kiritilmaydi.
ABBOSBEK IBRAGIMOV 18
@python_uzbek_coder PyMySQL
UPDATE sintaksisidagi WHERE bandiga e'tibor bering: WHERE bandida qaysi yozuv yoki yozuvlar yangilanishi kerakligi
ko'rsatilgan. Agar "WHERE" bandini tashlab ketsangiz, jadvaldagi barcha ma’lumotlar yangilanadi!
Har qanday so'rovning qiymatlaridan, shuningdek, yangilanish bayonotlaridan qochish yaxshi amaliyot deb hisoblanadi.
Bu ma'lumotlar bazasini yo'q qilish yoki suiiste'mol qilish uchun keng tarqalgan veb-xakerlik texnikasi bo'lgan SQL
in'ektsiyalarining oldini olish uchun. Zarur hisoblanadi.
Mysql.connector moduli o'chirish bayonotidagi qiymatlardan qochish uchun %s plomba vositasidan foydalanadi:
Misol
import mysql.connector
mydb.commit()
Natija:
1 ta yozuv o’zgartirildi
Natijalarni cheklash
Misol
ABBOSBEK IBRAGIMOV 19
@python_uzbek_coder PyMySQL
import mysql.connector
myresult = mycursor.fetchall()
for x in myresult:
print(x)
Natija:
Uchinchi ma’lumotdan boshlab beshta ma’lumotni qaytarishni istasangiz, "OFFSET" kalit so'zidan foydalanishingiz mumkin:
Misol
import mysql.connector
for x in myresult:
print(x)
Natija:
ABBOSBEK IBRAGIMOV 20
@python_uzbek_coder PyMySQL
JOIN iborasini ishlatib, ular orasidagi bog'liq ustunga asoslanib, ikki yoki undan ortiq jadvaldagi qatorlarni birlashtirish
mumkin.
Sizda "users" jadvali va "products" nomli jadvallar bor deb faraz qilaylik:
users
products
Ushbu ikkita jadval foydalanuvchilarning fav maydonini va mahsulotlarning identifikator maydonini ishlatib birlashtirilishi
mumkin.
Misol
Foydalanuvchilarning sevimli mahsuloti nomini ko'rish uchun foydalanuvchilar jadvalini mahsulotlar jadvaliniga
birlashtiramiz:
import mysql.connector
sql = "SELECT \ users.name AS user, \ products.name AS favorite \ FROM users \ INNER JOIN products ON user
s.fav = products.id"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
ABBOSBEK IBRAGIMOV 21
@python_uzbek_coder PyMySQL
Natija:
Izoh: INNER JOIN o’rniga JOIN dan foydalanishingiz mumkin. Ularning ikkalasi ham siga bir xil natijani beradi.
LEFT JOIN
Yuqoridagi misolda Xanna va Maykl natijadan chetlashtirildi, chunki INNER JOIN faqatgina mos ma’lumotlar bo'lgan joyda
ma’lumotlarni ko'rsatadi.
Agar siz barcha foydalanuvchilarga, hatto sevimli mahsuloti bo'lmasa ham, ularni ko'rsatishni xohlasangiz, LEFT JOIN
iborasidan foydalaning:
Misol
import mysql.connector
sql = "SELECT \ users.name AS user, \ products.name AS favorite \ FROM users \ LEFT JOIN products ON users.fa
v = products.id"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
Natija:
RIGHT JOIN
Agar siz barcha mahsulotlarni qaytarib berishni istasangiz va ularni eng sevimlisi bo'lgan foydalanuvchilarga, hatto biron bir
foydalanuvchi o'zlarining sevimli mahsulotlariga ega bo'lmagan holatida ham birlashtirmoqchi bo’lsangiz RIGHT JOIN
iborasidan foydalaning:
ABBOSBEK IBRAGIMOV 22
@python_uzbek_coder PyMySQL
Misol
Barcha mahsulotlarni va ularni eng sevimli deb topgan foydalanuvchi (lar) ni tanlang:
import mysql.connector
sql = "SELECT \ users.name AS user, \ products.name AS favorite \ FROM users \ RIGHT JOIN products ON user
s.fav = products.id"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
Natija:
ABBOSBEK IBRAGIMOV 23
@python_uzbek_coder PyMySQL
(BILL GEYTS)
ABBOSBEK IBRAGIMOV 24