Pythonda Malumotlar bazasi bilan ishlash Bajardi: 4-bosqich 406-guruh talabasi E. Tojimatov Raxbar


Pyton dasturlash tiliga MB sini ulash


Download 0.66 Mb.
bet3/16
Sana25.01.2023
Hajmi0.66 Mb.
#1121440
1   2   3   4   5   6   7   8   9   ...   16
Bog'liq
Kurs ishi





  1. Pyton dasturlash tiliga MB sini ulash.

Python kabi umumiy maqsadli dasturlash tilidan ma'lumotlar bazasiga qanday kirishni ko'rib chiqamiz. Boshqa tillar deyarli bir xil modeldan foydalanadi: kutubxona va funksiya nomlari farq qilishi mumkin, ammo tushunchalar bir xil.Mana, faylda saqlangan SQLite maʼlumotlar bazasidan kenglik va uzunliklarni tanlaydigan qisqa Python dasturi survey.db:


import sqlite3
connection = sqlite3.connect("survey.db")
cursor = connection.cursor()
cursor.execute("SELECT Site.lat, Site.long FROM Site;")
results = cursor.fetchall()
for r in results:
print(r)
cursor.close()
connection.close()
(-49.85, -128.57)
(-47.15, -126.72)
(-48.87, -123.4)
Dastur sqlite3kutubxonani import qilish bilan boshlanadi. Agar biz MySQL, DB2 yoki boshqa ma'lumotlar bazasiga ulangan bo'lsak, biz boshqa kutubxonani import qilgan bo'lardik, lekin ularning barchasi bir xil funktsiyalarni ta'minlaydi, shuning uchun dasturimizning qolgan qismi o'zgarishi shart emas (hech bo'lmaganda, ko'p emas). biz bir ma'lumotlar bazasidan ikkinchisiga o'tamiz.
2-qator ma'lumotlar bazasiga ulanishni o'rnatadi. Biz SQLite dan foydalanayotganimiz uchun ma'lumotlar bazasi faylining nomini ko'rsatishimiz kerak. Boshqa tizimlar ham foydalanuvchi nomi va parolni taqdim etishimizni talab qilishi mumkin. 3-qator keyin kursor yaratish uchun ushbu ulanishdan foydalanadi . Xuddi muharrirdagi kursor kabi, uning vazifasi ma'lumotlar bazasida qayerda ekanligimizni kuzatib borishdir.
4-qatorda biz ma'lumotlar bazasidan biz uchun so'rovni bajarishni so'rash uchun ushbu kursordan foydalanamiz. So'rov SQL da yoziladi va stringga cursor.executeuzatiladi. SQL to'g'ri formatlanganligiga ishonch hosil qilish bizning vazifamizdir; agar bunday bo'lmasa yoki u bajarilayotganda biror narsa noto'g'ri ketsa, ma'lumotlar bazasi xato haqida xabar beradi.Ma'lumotlar bazasi 5-qatordagi qo'ng'iroqqa javoban so'rov natijalarini bizga qaytaradi cursor.fetchall. Bu natija natijalar to'plamidagi har bir yozuv uchun bitta yozuvdan iborat ro'yxat; agar biz ushbu ro'yxatni (6-qator) aylantirsak va ushbu ro'yxat yozuvlarini (7-qator) chop qilsak, biz so'ragan har bir maydon uchun har bir element bitta elementga ega kortej ekanligini ko'rishimiz mumkin. Nihoyat, 8 va 9-qatorlar kursorimizni va ulanishimizni yopadi, chunki ma'lumotlar bazasi bir vaqtning o'zida faqat cheklangan miqdordagi ochiq qolishi mumkin. Ulanishni o'rnatish vaqt talab qiladigan bo'lsa-da, biz ulanishni ochib, bitta operatsiyani bajarib, keyin ulanishni yopmasligimiz kerak, faqat boshqa operatsiyani bajarish uchun bir necha mikrosekunddan keyin uni qayta ochishimiz kerak. Buning o'rniga, dasturning butun umri davomida ochiq qoladigan bitta ulanishni yaratish odatiy holdir. Haqiqiy ilovalardagi so'rovlar ko'pincha foydalanuvchilar tomonidan taqdim etilgan qiymatlarga bog'liq bo'ladi. Masalan, bu funksiya parametr sifatida foydalanuvchi identifikatorini oladi va uning nomini qaytaradi:
import sqlite3
def get_name(database_file, person_id):
query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"
connection = sqlite3.connect(database_file)
cursor = connection.cursor()
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
connection.close()
return results[0][0]
print("Full name for dyer:", get_name('survey.db', 'dyer'))
Full name for dyer: William Dyer
Bizga berilgan foydalanuvchi identifikatorini o'z ichiga olgan so'rovni yaratish uchun biz ushbu funktsiyaning birinchi qatorida qatorlarni birlashtirishdan foydalanamiz. Bu juda oddiy ko'rinadi, lekin kimdir bizga ushbu satrni kirish sifatida bersa nima bo'ladi?
dyer'; DROP TABLE Survey; SELECT '
Foydalanuvchi identifikatoridan keyin axlat borga o'xshaydi, lekin u juda ehtiyotkorlik bilan tanlangan axlat. Agar so'rovimizga ushbu qatorni kiritsak, natija quyidagicha bo'ladi:
SELECT personal || ' ' || family FROM Person WHERE id='dyer'; DROP TABLE Survey; SELECT '';
Agar biz buni bajarsak, u bizning ma'lumotlar bazasidagi jadvallardan birini o'chirib tashlaydi. Bu SQL injection hujumi deb ataladi va u yillar davomida minglab dasturlarga hujum qilish uchun ishlatilgan. Xususan, foydalanuvchilardan ma'lumotlarni oladigan ko'plab veb-saytlar qiymatlarni avval diqqat bilan tekshirmasdan so'rovlarga to'g'ridan-to'g'ri kiritadi.Yomon odam buyruqlarni turli yo'llar bilan so'rovlarimizga olib kirishga urinishi mumkinligi sababli, bu tahdid bilan kurashishning eng xavfsiz usuli - bu qo'shtirnoq kabi belgilarni ularning qochib ketgan ekvivalentlari bilan almashtirish, shunda biz foydalanuvchi bizga bergan narsani xavfsiz tarzda qatorga qo'yishimiz mumkin. Buni biz bayonotlarimizni satr sifatida formatlash o'rniga tayyorlangan bayonot yordamida amalga oshirishimiz mumkin. Agar biz buni qilsak, bizning misol dasturimiz qanday ko'rinadi: import sqlite3
def get_name(database_file, person_id):
query = "SELECT personal || ' ' || family FROM Person WHERE id=?;"
connection = sqlite3.connect(database_file)
cursor = connection.cursor()
cursor.execute(query, [person_id])
results = cursor.fetchall()
cursor.close()
connection.close()
return results[0][0]
print("Full name for dyer:", get_name('survey.db', 'dyer'))
Full name for dyer: William DyerAsosiy o'zgarishlar so'rovlar qatorida va executeqo'ng'iroqda. So'rovni o'zimiz formatlash o'rniga, biz qiymatlarni kiritmoqchi bo'lgan so'rov shabloniga savol belgilarini qo'yamiz. ga qo'ng'iroq executeqilganimizda, so'rovda qancha savol belgilari bo'lsa, shuncha qiymatlarni o'z ichiga olgan ro'yxatni taqdim etamiz. Kutubxona qiymatlarni savol belgilariga tartibda moslashtiradi va ulardan foydalanish xavfsiz bo'lishi uchun qiymatlardagi har qanday maxsus belgilarni o'zlarining qochib ketgan ekvivalentlariga tarjima qiladi.sqlite3Ma'lumotlar bazasiga o'zgartirishlar kiritish, masalan, yangi nom kiritish uchun kursordan ham foydalanishimiz mumkin.Masalan, biz add_nameshunday deb nomlangan yangi funktsiyani belgilashimiz mumkin:
import sqlite3
def add_name(database_file, new_person):
query = "INSERT INTO Person (id, personal, family) VALUES (?, ?, ?);"
connection = sqlite3.connect(database_file)
cursor = connection.cursor()
cursor.execute(query, list(new_person))
cursor.close()
connection.close()
def get_name(database_file, person_id):
query = "SELECT personal || ' ' || family FROM Person WHERE id=?;"
connection = sqlite3.connect(database_file)
cursor = connection.cursor()
cursor.execute(query, [person_id])
results = cursor.fetchall()
cursor.close()
connection.close()
return results[0][0]
# Insert a new name
add_name('survey.db', ('barrett', 'Mary', 'Barrett'))
# Check it exists
print("Full name for barrett:", get_name('survey.db', 'barrett'))
IndexError: list index out of range
Esda tutingki, sqlite3 >= 2.5 versiyalarida yuqorida tavsiflangan funksiya , biz Maryning yozuvini jadvalga yordamida qo‘shgan bo‘lsak ham, get_namebajarilmaydi . Buning sababi , ma'lumotlar bazasiga kiritilgan o'zgarishlarni saqlash uchun ulanishni yopishdan oldin bajarishimiz kerak.IndexError: list index out of rangeadd_nameconnection.commit()
import sqlite3
def add_name(database_file, new_person):
query = "INSERT INTO Person (id, personal, family) VALUES (?, ?, ?);"
connection = sqlite3.connect(database_file)
cursor = connection.cursor()
cursor.execute(query, list(new_person))
cursor.close()
connection.commit()
connection.close()
def get_name(database_file, person_id):
query = "SELECT personal || ' ' || family FROM Person WHERE id=?;"
connection = sqlite3.connect(database_file)
cursor = connection.cursor()
cursor.execute(query, [person_id])
results = cursor.fetchall()
cursor.close()
connection.close()
return results[0][0]
# Insert a new name
add_name('survey.db', ('barrett', 'Mary', 'Barrett'))
# Check it exists
print("Full name for barrett:", get_name('survey.db', 'barrett'))
Full name for barrett: Mary Barrett

Download 0.66 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   16




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling