🐍 آموزش جامع Python — پست ۱۷۸
تشخیص خودکار ساختار CSV با
گاهی نمیدانیم یک فایل CSV با چه جداکنندهای ساخته شده است.
ممکن است فایل با:
یا:
یا:
جدا شده باشد.
در چنین شرایطی میتوانیم از:
استفاده کنیم.
🔹 تشخیص
فرض کنیم فایل ما این باشد:
اما نمیدانیم جداکننده
میتوانیم از
خروجی:
Python توانسته جداکننده را از محتوای فایل تشخیص دهد.
🔹 استفاده از جداکننده تشخیصدادهشده
حالا میتوانیم همان
خروجی:
🔹 چرا
در این قسمت:
ما ۱۰۲۴ کاراکتر از فایل را میخوانیم.
مکان فعلی فایل دیگر ابتدای فایل نیست.
بنابراین:
مکان خواندن را به ابتدای فایل برمیگرداند.
بعد میتوانیم فایل را کامل با
🔹 تشخیص Header
میتوانیم از:
استفاده کنیم:
ممکن است خروجی:
باشد.
یعنی
⚠️ نکته مهم
مثلاً اگر فایل خیلی کوچک یا نامنظم باشد، ممکن است تشخیص اشتباه انجام شود.
پس:
یک ابزار تشخیص احتمالی است، نه تضمینی.
اگر ساختار CSV را از قبل میدانیم، بهتر است مستقیماً بنویسیم:
🧠 خلاصه
🎯 تمرین
فایل زیر را در نظر بگیر:
برنامهای بنویس که:
فایل را باز کند.
با
فایل را با
با
نام محصولات را چاپ کند.
خروجی:
پست ۱۷۸ از دوره جامع Python 🐍
تشخیص خودکار ساختار CSV با
csv.Snifferگاهی نمیدانیم یک فایل CSV با چه جداکنندهای ساخته شده است.
ممکن است فایل با:
,
یا:
;
یا:
|
جدا شده باشد.
در چنین شرایطی میتوانیم از:
csv.Sniffer
استفاده کنیم.
🔹 تشخیص
delimiterفرض کنیم فایل ما این باشد:
name;price;stock
Laptop;1200;5
Mouse;25;20
Keyboard;70;10
اما نمیدانیم جداکننده
; است.میتوانیم از
Sniffer استفاده کنیم:import csv
with open(
"products.csv",
"r",
encoding="utf-8"
) as file:
sample = file.read(1024)
dialect = csv.Sniffer().sniff(
sample,
delimiters=",;|"
)
print(dialect.delimiter)
خروجی:
;
Python توانسته جداکننده را از محتوای فایل تشخیص دهد.
🔹 استفاده از جداکننده تشخیصدادهشده
حالا میتوانیم همان
dialect را به DictReader بدهیم:import csv
with open(
"products.csv",
"r",
encoding="utf-8"
) as file:
sample = file.read(1024)
dialect = csv.Sniffer().sniff(
sample,
delimiters=",;|"
)
file.seek(0)
reader = csv.DictReader(
file,
dialect=dialect
)
for product in reader:
print(product["name"])
خروجی:
Laptop
Mouse
Keyboard
🔹 چرا
file.seek(0)؟در این قسمت:
sample = file.read(1024)
ما ۱۰۲۴ کاراکتر از فایل را میخوانیم.
مکان فعلی فایل دیگر ابتدای فایل نیست.
بنابراین:
file.seek(0)
مکان خواندن را به ابتدای فایل برمیگرداند.
بعد میتوانیم فایل را کامل با
DictReader بخوانیم.🔹 تشخیص Header
Sniffer قابلیت دیگری هم دارد.میتوانیم از:
has_header()
استفاده کنیم:
import csv
with open(
"products.csv",
"r",
encoding="utf-8"
) as file:
sample = file.read(1024)
has_header = csv.Sniffer().has_header(sample)
print(has_header)
ممکن است خروجی:
True
باشد.
یعنی
Sniffer تشخیص داده که احتمالاً فایل دارای Header است.⚠️ نکته مهم
Sniffer همیشه نمیتواند با اطمینان کامل ساختار فایل را تشخیص دهد.مثلاً اگر فایل خیلی کوچک یا نامنظم باشد، ممکن است تشخیص اشتباه انجام شود.
پس:
csv.Sniffer()
یک ابزار تشخیص احتمالی است، نه تضمینی.
اگر ساختار CSV را از قبل میدانیم، بهتر است مستقیماً بنویسیم:
reader = csv.DictReader(
file,
delimiter=";"
)
🧠 خلاصه
csv.Sniffer().sniff()
↓
تشخیص Dialect / delimiter
file.seek(0)
↓
بازگشت به ابتدای فایل
csv.Sniffer().has_header()
↓
تشخیص احتمالی وجود Header
🎯 تمرین
فایل زیر را در نظر بگیر:
name|price|stock
Laptop|1200|5
Mouse|25|20
Keyboard|70|10
برنامهای بنویس که:
فایل را باز کند.
با
csv.Sniffer().sniff() جداکننده را تشخیص دهد.فایل را با
seek(0) به ابتدا برگرداند.با
DictReader اطلاعات را بخواند.نام محصولات را چاپ کند.
خروجی:
Laptop
Mouse
Keyboard
پست ۱۷۸ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۷۹
مثال کامل و مقاوم در برابر خطا برای CSV
حالا چند مفهوم CSV را در یک برنامه واقعی ترکیب میکنیم:
بررسی وجود فایل
تشخیص
بررسی Header
تبدیل
مدیریت خطاهای تبدیل
رد کردن رکوردهای نامعتبر
🔹 فایل نمونه
🔹 برنامه کامل
🔹 نتیجه
رکوردهای معتبر پردازش میشوند:
و رکوردهای خراب فقط گزارش میشوند:
برنامه به خاطر یک رکورد خراب متوقف نمیشود.
🧠 الگوی کلی
⚠️ اگر
🎯 تمرین
کد را تغییر بده تا ستون
پست ۱۷۹ از دوره جامع Python 🐍
مثال کامل و مقاوم در برابر خطا برای CSV
حالا چند مفهوم CSV را در یک برنامه واقعی ترکیب میکنیم:
بررسی وجود فایل
تشخیص
delimiterبررسی Header
تبدیل
price و stockمدیریت خطاهای تبدیل
رد کردن رکوردهای نامعتبر
🔹 فایل نمونه
name;price;stock
Laptop;1200;5
Mouse;25;20
Keyboard;unknown;10
Monitor;300;invalid
Phone;800;15
🔹 برنامه کامل
import csv
from pathlib import Path
file_path = Path("products.csv")
try:
if not file_path.exists():
raise FileNotFoundError("File not found")
with file_path.open(
"r",
encoding="utf-8",
newline=""
) as file:
sample = file.read(1024)
if not sample.strip():
raise ValueError("CSV file is empty")
try:
dialect = csv.Sniffer().sniff(
sample,
delimiters=",;|"
)
except csv.Error:
print("Could not detect delimiter")
raise SystemExit
file.seek(0)
reader = csv.DictReader(
file,
dialect=dialect
)
required = {"name", "price", "stock"}
if not required.issubset(
set(reader.fieldnames or [])
):
print("Required columns are missing")
raise SystemExit
for row_number, product in enumerate(
reader,
start=2
):
try:
name = product["name"].strip()
price = float(product["price"])
stock = int(product["stock"])
if not name or price < 0 or stock < 0:
raise ValueError("Invalid data")
print(
f"{name} - ${price} - Stock: {stock}"
)
except (ValueError, TypeError):
print(
f"Invalid row: {row_number}"
)
except FileNotFoundError:
print("File not found")
except PermissionError:
print("Permission denied")
except UnicodeDecodeError:
print("Invalid file encoding")
except csv.Error as error:
print(f"CSV error: {error}")
🔹 نتیجه
رکوردهای معتبر پردازش میشوند:
Laptop - $1200.0 - Stock: 5
Mouse - $25.0 - Stock: 20
Phone - $800.0 - Stock: 15
و رکوردهای خراب فقط گزارش میشوند:
Invalid row: 4
Invalid row: 5
برنامه به خاطر یک رکورد خراب متوقف نمیشود.
🧠 الگوی کلی
فایل
↓
بررسی ساختار
↓
خواندن CSV
↓
تبدیل نوع داده
↓
اعتبارسنجی
↓
مدیریت خطا
↓
استفاده از داده معتبر
⚠️ اگر
delimiter را از قبل میدانیم، بهتر است بهجای Sniffer مستقیماً آن را مشخص کنیم:csv.DictReader(file, delimiter=";")
🎯 تمرین
کد را تغییر بده تا ستون
category را هم بررسی کند و اگر خالی بود، رکورد را نامعتبر اعلام کند.پست ۱۷۹ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۸۰
تبدیل CSV به JSON
تا اینجا با خواندن، نوشتن، ویرایش، حذف و اعتبارسنجی دادههای CSV آشنا شدیم.
حالا میخواهیم دادههای CSV را به JSON تبدیل کنیم.
این کار زمانی مفید است که داده را از یک فایل جدولی به ساختاری مناسب برای برنامهها و APIها منتقل کنیم.
🔹 فایل CSV
فرض کنیم
ابتدا CSV را با
حالا:
تقریباً:
⚠️ توجه کن که مقدارها هنوز
🔹 تبدیل نوع داده
قبل از تبدیل به JSON بهتر است نوع دادههای عددی را اصلاح کنیم:
حالا میتوانیم داده را به JSON تبدیل کنیم:
خروجی:
🔹 ذخیره JSON در فایل
میتوانیم نتیجه را مستقیماً در یک فایل ذخیره کنیم:
حالا یک فایل به نام:
داریم.
⚠️ مدیریت خطا
اگر CSV شامل مقدار نامعتبر باشد:
تبدیل:
باعث
پس در برنامه واقعی بهتر است:
را در نظر بگیریم.
🧠 خلاصه
🎯 تمرین
فایل
شرایط:
رکوردهای دارای داده نامعتبر نادیده گرفته شوند.
پست ۱۸۰ از دوره جامع Python 🐍
تبدیل CSV به JSON
تا اینجا با خواندن، نوشتن، ویرایش، حذف و اعتبارسنجی دادههای CSV آشنا شدیم.
حالا میخواهیم دادههای CSV را به JSON تبدیل کنیم.
این کار زمانی مفید است که داده را از یک فایل جدولی به ساختاری مناسب برای برنامهها و APIها منتقل کنیم.
🔹 فایل CSV
فرض کنیم
products.csv این باشد:name,price,stock
Laptop,1200,5
Mouse,25,20
Keyboard,70,10
ابتدا CSV را با
DictReader میخوانیم:import csv
with open(
"products.csv",
"r",
encoding="utf-8"
) as file:
reader = csv.DictReader(file)
products = list(reader)
حالا:
print(products)
تقریباً:
[
{'name': 'Laptop', 'price': '1200', 'stock': '5'},
{'name': 'Mouse', 'price': '25', 'stock': '20'},
{'name': 'Keyboard', 'price': '70', 'stock': '10'}
]
⚠️ توجه کن که مقدارها هنوز
str هستند.🔹 تبدیل نوع داده
قبل از تبدیل به JSON بهتر است نوع دادههای عددی را اصلاح کنیم:
for product in products:
product["price"] = float(product["price"])
product["stock"] = int(product["stock"])
حالا میتوانیم داده را به JSON تبدیل کنیم:
import json
json_data = json.dumps(
products,
indent=4,
ensure_ascii=False
)
print(json_data)
خروجی:
[
{
"name": "Laptop",
"price": 1200.0,
"stock": 5
},
{
"name": "Mouse",
"price": 25.0,
"stock": 20
}
]
🔹 ذخیره JSON در فایل
میتوانیم نتیجه را مستقیماً در یک فایل ذخیره کنیم:
with open(
"products.json",
"w",
encoding="utf-8"
) as file:
json.dump(
products,
file,
indent=4,
ensure_ascii=False
)
حالا یک فایل به نام:
products.json
داریم.
⚠️ مدیریت خطا
اگر CSV شامل مقدار نامعتبر باشد:
name,price,stock
Laptop,unknown,5
تبدیل:
float("unknown")باعث
ValueError میشود.پس در برنامه واقعی بهتر است:
try:
product["price"] = float(product["price"])
product["stock"] = int(product["stock"])
except ValueError:
print("Invalid product data")
را در نظر بگیریم.
🧠 خلاصه
CSV
↓
DictReader
↓
Dictionary
↓
تبدیل نوع داده
↓
JSON
↓
json.dump()
🎯 تمرین
فایل
products.csv را به products.json تبدیل کن.شرایط:
name به صورت strprice به صورت floatstock به صورت intرکوردهای دارای داده نامعتبر نادیده گرفته شوند.
پست ۱۸۰ از دوره جامع Python 🐍
🤖 معرفی چند پروژه و ابزار جالب در حوزه AI
اگر به دنبال پروژههای جدید و متنباز در حوزه هوش مصنوعی هستید، این دو مورد را هم میتوانید بررسی کنید:
🔹 JEV
🌐 وبسایت:
typesafe.ai
JEV یک پروژه/پلتفرم در حوزه AI است که میتوانید برای آشنایی بیشتر با قابلیتها و نحوه استفاده از آن، وبسایت رسمی آن را بررسی کنید.
🔗 لینک:
https://typesafe.ai
🔹 LAYA
یک پروژه متنباز مرتبط با اجرای مدلهای هوش مصنوعی و اکوسیستم MLX.
💻 GitHub:
Laya — GitHub
🤗 Hugging Face:
Laya — Hugging Face
اگر به مدلهای AI، اجرای مدلها و پروژههای متنباز علاقه دارید، بررسی Repository و فایلهای پروژه میتواند اطلاعات بیشتری درباره نحوه استفاده و قابلیتهای آن ارائه دهد.
📌 لینکها
🔹 JEV:
typesafe.ai
🔹 LAYA — GitHub:
mizorewww/laya-mlx
🔹 LAYA — Hugging Face:
aac6fef
اگر پروژههای AI متنباز و ابزارهای جدید هوش مصنوعی را دنبال میکنید، این موارد میتوانند برای بررسی و یادگیری جالب باشند. 🤖
اگر به دنبال پروژههای جدید و متنباز در حوزه هوش مصنوعی هستید، این دو مورد را هم میتوانید بررسی کنید:
🔹 JEV
🌐 وبسایت:
typesafe.ai
JEV یک پروژه/پلتفرم در حوزه AI است که میتوانید برای آشنایی بیشتر با قابلیتها و نحوه استفاده از آن، وبسایت رسمی آن را بررسی کنید.
🔗 لینک:
https://typesafe.ai
🔹 LAYA
یک پروژه متنباز مرتبط با اجرای مدلهای هوش مصنوعی و اکوسیستم MLX.
💻 GitHub:
Laya — GitHub
🤗 Hugging Face:
Laya — Hugging Face
اگر به مدلهای AI، اجرای مدلها و پروژههای متنباز علاقه دارید، بررسی Repository و فایلهای پروژه میتواند اطلاعات بیشتری درباره نحوه استفاده و قابلیتهای آن ارائه دهد.
📌 لینکها
🔹 JEV:
typesafe.ai
🔹 LAYA — GitHub:
mizorewww/laya-mlx
🔹 LAYA — Hugging Face:
aac6fef
اگر پروژههای AI متنباز و ابزارهای جدید هوش مصنوعی را دنبال میکنید، این موارد میتوانند برای بررسی و یادگیری جالب باشند. 🤖
typesafe.ai
Home - TypeSafe AI
TypeSafe AI is an AI lab building machine-native intelligence infrastructure for automation, designed to make decisions within software. Try our first System One Model, Jev, in early access.
🐍 آموزش جامع Python — پست ۱۸۱
آشنایی با دیتابیس SQLite در Python
تا اینجا اطلاعات را در فایلهایی مثل:
ذخیره و مدیریت کردیم.
اما وقتی حجم داده بیشتر شود، جستوجو، ویرایش و حذف اطلاعات در فایلها میتواند سختتر شود.
اینجاست که Database وارد میشود.
یکی از سادهترین دیتابیسها برای شروع در Python، SQLite است.
🔹 SQLite چیست؟
SQLite یک دیتابیس سبک و فایلمحور است.
برخلاف بعضی دیتابیسها، برای شروع نیاز نداریم یک Server جداگانه نصب و اجرا کنیم.
Python نیز ماژول استاندارد:
را در اختیارمان قرار میدهد.
🔹 ساخت اولین دیتابیس
با اجرای این کد، فایل:
ایجاد میشود.
اگر فایل از قبل وجود داشته باشد، SQLite همان دیتابیس را باز میکند.
🔹 Connection چیست؟
این خط:
یک Connection به دیتابیس ایجاد میکند.
از طریق این Connection میتوانیم:
در پایان نیز بهتر است Connection را ببندیم:
🔹 ساخت Table
برای ذخیره اطلاعات، ابتدا یک جدول ایجاد میکنیم.
در اینجا جدول:
ساخته میشود.
و سه ستون دارد:
🔹
با:
یک Cursor ایجاد میکنیم.
Cursor برای اجرای دستورات SQL استفاده میشود:
مثلاً:
⚠️
بعد از تغییرات دیتابیس معمولاً باید تغییرات را ثبت کنیم:
مثلاً هنگام:
استفاده از
🧠 خلاصه
در پست بعد یاد میگیریم چگونه با
🎯 تمرین
برنامهای بنویس که:
یک دیتابیس به نام
جدولی به نام
جدول شامل این ستونها باشد:
از:
استفاده کن.
پست ۱۸۱ از دوره جامع Python 🐍
آشنایی با دیتابیس SQLite در Python
تا اینجا اطلاعات را در فایلهایی مثل:
CSV
JSON
ذخیره و مدیریت کردیم.
اما وقتی حجم داده بیشتر شود، جستوجو، ویرایش و حذف اطلاعات در فایلها میتواند سختتر شود.
اینجاست که Database وارد میشود.
یکی از سادهترین دیتابیسها برای شروع در Python، SQLite است.
🔹 SQLite چیست؟
SQLite یک دیتابیس سبک و فایلمحور است.
برخلاف بعضی دیتابیسها، برای شروع نیاز نداریم یک Server جداگانه نصب و اجرا کنیم.
Python نیز ماژول استاندارد:
sqlite3
را در اختیارمان قرار میدهد.
🔹 ساخت اولین دیتابیس
import sqlite3
connection = sqlite3.connect("users.db")
print("Database created")
connection.close()
با اجرای این کد، فایل:
users.db
ایجاد میشود.
اگر فایل از قبل وجود داشته باشد، SQLite همان دیتابیس را باز میکند.
🔹 Connection چیست؟
این خط:
connection = sqlite3.connect("users.db")یک Connection به دیتابیس ایجاد میکند.
از طریق این Connection میتوانیم:
دستور SQL اجرا کنیم
داده اضافه کنیم
داده بخوانیم
داده تغییر دهیم
داده حذف کنیم
در پایان نیز بهتر است Connection را ببندیم:
connection.close()
🔹 ساخت Table
برای ذخیره اطلاعات، ابتدا یک جدول ایجاد میکنیم.
import sqlite3
connection = sqlite3.connect("users.db")
cursor = connection.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
)
""")
connection.commit()
connection.close()
در اینجا جدول:
users
ساخته میشود.
و سه ستون دارد:
id → INTEGER
name → TEXT
age → INTEGER
🔹
cursor چیست؟با:
cursor = connection.cursor()
یک Cursor ایجاد میکنیم.
Cursor برای اجرای دستورات SQL استفاده میشود:
cursor.execute(...)
مثلاً:
cursor.execute("SELECT * FROM users")⚠️
commit() را فراموش نکنبعد از تغییرات دیتابیس معمولاً باید تغییرات را ثبت کنیم:
connection.commit()
مثلاً هنگام:
INSERT
UPDATE
DELETE
استفاده از
commit() اهمیت دارد.🧠 خلاصه
sqlite3.connect()
↓
Connection
↓
Cursor
↓
cursor.execute()
↓
connection.commit()
↓
connection.close()
در پست بعد یاد میگیریم چگونه با
INSERT اطلاعات را داخل SQLite ذخیره کنیم.🎯 تمرین
برنامهای بنویس که:
یک دیتابیس به نام
school.db ایجاد کند.جدولی به نام
students بسازد.جدول شامل این ستونها باشد:
id → INTEGER PRIMARY KEY
name → TEXT
score → REAL
از:
CREATE TABLE IF NOT EXISTS
استفاده کن.
پست ۱۸۱ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۸۲
درج چند رکورد با
در پست قبل یاد گرفتیم با
اما اگر بخواهیم چند رکورد را همزمان اضافه کنیم، استفاده از چندین
برای این کار میتوانیم از:
استفاده کنیم.
🔹 مثال ساده
فرض کنیم جدول زیر را داریم:
حالا چند کاربر داریم:
میتوانیم همه را با یک دستور درج کنیم:
🔹
این کد:
عبارت SQL را برای هر عضو
یعنی تقریباً مثل این است:
اما
🔹 مثال کامل
بعد از اجرای برنامه، سه رکورد به جدول اضافه میشود.
🔹 استفاده از
همانند
و دادهها جداگانه قرار بگیرند:
این روش هم خواناتر است و هم از قرار دادن مستقیم مقدارها داخل SQL جلوگیری میکند.
🔹
یک نکته مهم:
برای درج چند رکورد، روش مناسبی برای دریافت ID همه رکوردهای جدید نیست.
اگر به ID رکوردهای ایجادشده نیاز دارید، بهتر است بعداً آنها را با یک Query مناسب از دیتابیس دریافت کنید.
⚠️ نکته مهم
ساختار دادهها باید با تعداد
مثلاً:
یعنی هر رکورد باید دو مقدار داشته باشد:
اما این اشتباه است:
چون تعداد مقادیر با Placeholderها هماهنگ نیست.
🧠 خلاصه
الگوی اصلی:
🎯 تمرین
جدول زیر را در نظر بگیر:
با ستونهای:
با استفاده از
در پایان
پست ۱۸۲ از دوره جامع Python 🐍
درج چند رکورد با
executemany()در پست قبل یاد گرفتیم با
INSERT یک رکورد را داخل SQLite ذخیره کنیم.اما اگر بخواهیم چند رکورد را همزمان اضافه کنیم، استفاده از چندین
execute() کار چندان مناسبی نیست.برای این کار میتوانیم از:
executemany()
استفاده کنیم.
🔹 مثال ساده
فرض کنیم جدول زیر را داریم:
import sqlite3
connection = sqlite3.connect("users.db")
cursor = connection.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
)
""")
حالا چند کاربر داریم:
users = [
("Ali", 25),
("Sara", 22),
("Reza", 30)
]
میتوانیم همه را با یک دستور درج کنیم:
cursor.executemany(
"INSERT INTO users (name, age) VALUES (?, ?)",
users
)
connection.commit()
🔹
executemany() چگونه کار میکند؟این کد:
cursor.executemany(
"INSERT INTO users (name, age) VALUES (?, ?)",
users
)
عبارت SQL را برای هر عضو
users اجرا میکند:("Ali", 25)
("Sara", 22)
("Reza", 30)یعنی تقریباً مثل این است:
cursor.execute(
"INSERT INTO users (name, age) VALUES (?, ?)",
("Ali", 25)
)
cursor.execute(
"INSERT INTO users (name, age) VALUES (?, ?)",
("Sara", 22)
)
cursor.execute(
"INSERT INTO users (name, age) VALUES (?, ?)",
("Reza", 30)
)
اما
executemany() برای درج مجموعهای از رکوردها مناسبتر و خواناتر است.🔹 مثال کامل
import sqlite3
connection = sqlite3.connect("users.db")
cursor = connection.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
)
""")
users = [
("Ali", 25),
("Sara", 22),
("Reza", 30)
]
cursor.executemany(
"INSERT INTO users (name, age) VALUES (?, ?)",
users
)
connection.commit()
connection.close()
بعد از اجرای برنامه، سه رکورد به جدول اضافه میشود.
🔹 استفاده از
?همانند
execute() بهتر است مقدارها را با Parameterized Query ارسال کنیم:"INSERT INTO users (name, age) VALUES (?, ?)"
و دادهها جداگانه قرار بگیرند:
users = [
("Ali", 25),
("Sara", 22)
]
این روش هم خواناتر است و هم از قرار دادن مستقیم مقدارها داخل SQL جلوگیری میکند.
🔹
executemany() با lastrowidیک نکته مهم:
cursor.lastrowid
برای درج چند رکورد، روش مناسبی برای دریافت ID همه رکوردهای جدید نیست.
اگر به ID رکوردهای ایجادشده نیاز دارید، بهتر است بعداً آنها را با یک Query مناسب از دیتابیس دریافت کنید.
⚠️ نکته مهم
ساختار دادهها باید با تعداد
?ها هماهنگ باشد.مثلاً:
"VALUES (?, ?)"
یعنی هر رکورد باید دو مقدار داشته باشد:
("Ali", 25)اما این اشتباه است:
("Ali", 25, "Extra")چون تعداد مقادیر با Placeholderها هماهنگ نیست.
🧠 خلاصه
execute() → اجرای یک عملیات
executemany() → اجرای یک عملیات برای چند مجموعه داده
الگوی اصلی:
cursor.executemany(
"INSERT INTO table_name (column1, column2) VALUES (?, ?)",
data
)
🎯 تمرین
جدول زیر را در نظر بگیر:
students
با ستونهای:
id → INTEGER PRIMARY KEY
name → TEXT
score → REAL
با استفاده از
executemany() این سه دانشآموز را اضافه کن:students = [
("Ali", 18.5),
("Sara", 19.0),
("Reza", 17.25)
]
در پایان
commit() را اجرا کن.پست ۱۸۲ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۸۳
خواندن اطلاعات از SQLite با
تا اینجا یاد گرفتیم چگونه اطلاعات را با
حالا میخواهیم اطلاعات ذخیرهشده را بخوانیم.
برای این کار از دستور SQL زیر استفاده میکنیم:
🔹 خواندن همه رکوردها
فرض کنیم جدول
مثلاً خروجی:
هر رکورد به شکل یک tuple برگردانده میشود.
🔹
بعد از اجرای:
میتوانیم با:
تمام رکوردهای نتیجه را دریافت کنیم.
مثلاً:
🔹 خواندن فقط یک رکورد
اگر فقط یک رکورد میخواهیم، میتوانیم از:
استفاده کنیم:
خروجی:
🔹 دریافت چند رکورد با
اگر تعداد مشخصی رکورد بخواهیم:
مثلاً:
🔹 انتخاب ستونهای مشخص
لازم نیست همیشه از
مثلاً فقط نام و نمره:
خروجی:
⚠️ نکته مهم
یعنی:
🧠 خلاصه
سه روش اصلی دریافت نتیجه:
🎯 تمرین
از جدول
جدول:
خروجی باید چیزی شبیه این باشد:
پست ۱۸۳ از دوره جامع Python 🐍
خواندن اطلاعات از SQLite با
SELECTتا اینجا یاد گرفتیم چگونه اطلاعات را با
INSERT و executemany() داخل SQLite ذخیره کنیم.حالا میخواهیم اطلاعات ذخیرهشده را بخوانیم.
برای این کار از دستور SQL زیر استفاده میکنیم:
SELECT
🔹 خواندن همه رکوردها
فرض کنیم جدول
students را داریم:import sqlite3
connection = sqlite3.connect("school.db")
cursor = connection.cursor()
cursor.execute("SELECT * FROM students")
rows = cursor.fetchall()
for row in rows:
print(row)
connection.close()
مثلاً خروجی:
(1, 'Ali', 18.5)
(2, 'Sara', 19.0)
(3, 'Reza', 17.25)
هر رکورد به شکل یک tuple برگردانده میشود.
🔹
fetchall() چیست؟بعد از اجرای:
cursor.execute("SELECT * FROM students")میتوانیم با:
rows = cursor.fetchall()
تمام رکوردهای نتیجه را دریافت کنیم.
مثلاً:
[
(1, 'Ali', 18.5),
(2, 'Sara', 19.0),
(3, 'Reza', 17.25)
]
🔹 خواندن فقط یک رکورد
اگر فقط یک رکورد میخواهیم، میتوانیم از:
row = cursor.fetchone()
استفاده کنیم:
cursor.execute("SELECT * FROM students")
row = cursor.fetchone()
print(row)خروجی:
(1, 'Ali', 18.5)
fetchone() هر بار یک رکورد از نتیجه را برمیگرداند.🔹 دریافت چند رکورد با
fetchmany()اگر تعداد مشخصی رکورد بخواهیم:
cursor.execute("SELECT * FROM students")
rows = cursor.fetchmany(2)
print(rows)مثلاً:
[(1, 'Ali', 18.5), (2, 'Sara', 19.0)]
🔹 انتخاب ستونهای مشخص
لازم نیست همیشه از
* استفاده کنیم.مثلاً فقط نام و نمره:
cursor.execute(
"SELECT name, score FROM students"
)
rows = cursor.fetchall()
for name, score in rows:
print(name, score)
خروجی:
Ali 18.5
Sara 19.0
Reza 17.25
⚠️ نکته مهم
SELECT اطلاعات را تغییر نمیدهد.یعنی:
SELECT → خواندن
INSERT → اضافه کردن
UPDATE → تغییر دادن
DELETE → حذف کردن
🧠 خلاصه
execute("SELECT ...")
↓
fetchone()
fetchmany()
fetchall()سه روش اصلی دریافت نتیجه:
cursor.fetchone()
cursor.fetchmany(n)
cursor.fetchall()
🎯 تمرین
از جدول
students فقط name و score را دریافت کن و نام و نمره هر دانشآموز را چاپ کن.جدول:
id | name | score
خروجی باید چیزی شبیه این باشد:
Ali 18.5
Sara 19.0
Reza 17.25
پست ۱۸۳ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۸۴
جستوجو و فیلتر دادهها در SQLite با
در پست قبل یاد گرفتیم با
اما معمولاً نمیخواهیم همه رکوردها را دریافت کنیم.
مثلاً میخواهیم فقط دانشآموزانی را پیدا کنیم که نمرهشان بیشتر از
برای این کار از:
استفاده میکنیم.
🔹 یک شرط ساده
اگر دادهها این باشند:
خروجی:
🔹 جستوجو بر اساس متن
مثلاً فقط کاربری با نام
نکته مهم:
🔹 استفاده از
میتوانیم چند شرط داشته باشیم:
در اینجا هر دو شرط باید برقرار باشند.
🔹 استفاده از
اگر کافی باشد یکی از شرطها برقرار باشد:
در این حالت دانشآموزانی با نام
🔹
هم استفاده میشود.
مثلاً بعداً میتوانیم فقط نمره یک دانشآموز مشخص را تغییر دهیم:
یا فقط یک رکورد مشخص را حذف کنیم:
⚠️ نکته امنیتی
مقدارهای دریافتشده از کاربر را مستقیماً داخل SQL قرار نده.
❌ روش نامناسب:
✅ روش مناسب:
با
🧠 خلاصه
الگوی اصلی:
🎯 تمرین
از جدول
و سپس فقط
خروجی مثلاً:
پست ۱۸۴ از دوره جامع Python 🐍
جستوجو و فیلتر دادهها در SQLite با
WHEREدر پست قبل یاد گرفتیم با
SELECT اطلاعات را از SQLite بخوانیم.اما معمولاً نمیخواهیم همه رکوردها را دریافت کنیم.
مثلاً میخواهیم فقط دانشآموزانی را پیدا کنیم که نمرهشان بیشتر از
18 است.برای این کار از:
WHERE
استفاده میکنیم.
🔹 یک شرط ساده
import sqlite3
connection = sqlite3.connect("school.db")
cursor = connection.cursor()
cursor.execute(
"SELECT * FROM students WHERE score >= ?",
(18,)
)
rows = cursor.fetchall()
for row in rows:
print(row)
connection.close()
اگر دادهها این باشند:
(1, 'Ali', 18.5)
(2, 'Sara', 19.0)
(3, 'Reza', 17.25)
خروجی:
(1, 'Ali', 18.5)
(2, 'Sara', 19.0)
🔹 جستوجو بر اساس متن
مثلاً فقط کاربری با نام
Ali:cursor.execute(
"SELECT * FROM students WHERE name = ?",
("Ali",)
)
row = cursor.fetchone()
print(row)
نکته مهم:
( "Ali", ) یک tuple تکعضوی است.🔹 استفاده از
ANDمیتوانیم چند شرط داشته باشیم:
cursor.execute(
"""
SELECT * FROM students
WHERE score >= ? AND name = ?
""",
(18, "Ali")
)
در اینجا هر دو شرط باید برقرار باشند.
🔹 استفاده از
ORاگر کافی باشد یکی از شرطها برقرار باشد:
cursor.execute(
"""
SELECT * FROM students
WHERE name = ? OR name = ?
""",
("Ali", "Sara")
)
در این حالت دانشآموزانی با نام
Ali یا Sara پیدا میشوند.🔹
WHERE فقط برای SELECT نیستWHERE در دستورات دیگری مثل:UPDATE
DELETE
هم استفاده میشود.
مثلاً بعداً میتوانیم فقط نمره یک دانشآموز مشخص را تغییر دهیم:
UPDATE students
SET score = 20
WHERE name = 'Ali';
یا فقط یک رکورد مشخص را حذف کنیم:
DELETE FROM students
WHERE name = 'Ali';
⚠️ نکته امنیتی
مقدارهای دریافتشده از کاربر را مستقیماً داخل SQL قرار نده.
❌ روش نامناسب:
name = input("Name: ")
cursor.execute(
f"SELECT * FROM students WHERE name = '{name}'"
)✅ روش مناسب:
name = input("Name: ")
cursor.execute(
"SELECT * FROM students WHERE name = ?",
(name,)
)با
? از Parameterized Query استفاده میکنیم.🧠 خلاصه
SELECT → خواندن داده
WHERE → فیلتر کردن داده
AND → هر دو شرط
OR → حداقل یکی از شرطها
? → پارامتر امن
الگوی اصلی:
cursor.execute(
"SELECT * FROM students WHERE score >= ?",
(18,)
)
🎯 تمرین
از جدول
students فقط دانشآموزانی را پیدا کن که:score >= 18
و سپس فقط
name و score آنها را چاپ کن.خروجی مثلاً:
Ali 18.5
Sara 19.0
پست ۱۸۴ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۸۵
مرتبسازی و محدود کردن نتایج با
در پست قبل یاد گرفتیم با
حالا میخواهیم نتیجهها را:
مرتب کنیم.
تعداد نتیجهها را محدود کنیم.
برای این کار از
🔹 مرتبسازی با
فرض کنیم میخواهیم دانشآموزان را بر اساس نمره مرتب کنیم:
بهصورت پیشفرض مرتبسازی صعودی (
🔹 مرتبسازی نزولی با
اگر بخواهیم بالاترین نمره ابتدا نمایش داده شود:
نتیجه:
پس:
🔹 مرتبسازی بر اساس چند ستون
میتوانیم چند ستون را هم مشخص کنیم:
ابتدا بر اساس
اگر چند رکورد نمره یکسان داشته باشند،
🔹 محدود کردن نتایج با
فرض کنیم فقط میخواهیم سه دانشآموز اول را دریافت کنیم:
در اینجا ابتدا نمرهها از بیشترین به کمترین مرتب میشوند و سپس فقط ۳ نتیجه برگردانده میشود.
🔥 پیدا کردن بالاترین نمره
ترکیب
مثلاً:
🔹
این کد:
فقط سه رکورد را درخواست میکند؛ اما نباید فرض کنیم این سه رکورد حتماً «اولین» یا «بهترین» رکوردها هستند.
اگر ترتیب مشخصی میخواهیم، بهتر است
🧠 خلاصه
مثلاً:
یعنی:
🎯 تمرین
از جدول
شرایط:
پست ۱۸۵ از دوره جامع Python 🐍
مرتبسازی و محدود کردن نتایج با
ORDER BY و LIMITدر پست قبل یاد گرفتیم با
WHERE اطلاعات موردنظرمان را فیلتر کنیم.حالا میخواهیم نتیجهها را:
مرتب کنیم.
تعداد نتیجهها را محدود کنیم.
برای این کار از
ORDER BY و LIMIT استفاده میکنیم.🔹 مرتبسازی با
ORDER BYفرض کنیم میخواهیم دانشآموزان را بر اساس نمره مرتب کنیم:
import sqlite3
connection = sqlite3.connect("school.db")
cursor = connection.cursor()
cursor.execute("""
SELECT name, score
FROM students
ORDER BY score
""")
rows = cursor.fetchall()
for row in rows:
print(row)
connection.close()
بهصورت پیشفرض مرتبسازی صعودی (
ASC) است:17.25
18.5
19.0
🔹 مرتبسازی نزولی با
DESCاگر بخواهیم بالاترین نمره ابتدا نمایش داده شود:
cursor.execute("""
SELECT name, score
FROM students
ORDER BY score DESC
""")نتیجه:
Sara 19.0
Ali 18.5
Reza 17.25
پس:
ASC → صعودی
DESC → نزولی
🔹 مرتبسازی بر اساس چند ستون
میتوانیم چند ستون را هم مشخص کنیم:
cursor.execute("""
SELECT name, score
FROM students
ORDER BY score DESC, name ASC
""")ابتدا بر اساس
score مرتب میشود.اگر چند رکورد نمره یکسان داشته باشند،
name برای مرتبسازی بعدی استفاده میشود.🔹 محدود کردن نتایج با
LIMITفرض کنیم فقط میخواهیم سه دانشآموز اول را دریافت کنیم:
cursor.execute("""
SELECT name, score
FROM students
ORDER BY score DESC
LIMIT 3
""")در اینجا ابتدا نمرهها از بیشترین به کمترین مرتب میشوند و سپس فقط ۳ نتیجه برگردانده میشود.
🔥 پیدا کردن بالاترین نمره
ترکیب
ORDER BY و LIMIT کاربرد زیادی دارد:cursor.execute("""
SELECT name, score
FROM students
ORDER BY score DESC
LIMIT 1
""")
top_student = cursor.fetchone()
print(top_student)مثلاً:
('Sara', 19.0)🔹
LIMIT بدون ORDER BYاین کد:
SELECT * FROM students LIMIT 3
فقط سه رکورد را درخواست میکند؛ اما نباید فرض کنیم این سه رکورد حتماً «اولین» یا «بهترین» رکوردها هستند.
اگر ترتیب مشخصی میخواهیم، بهتر است
ORDER BY را هم مشخص کنیم.🧠 خلاصه
ORDER BY → مرتبسازی
ASC → صعودی
DESC → نزولی
LIMIT → محدود کردن تعداد نتایج
مثلاً:
cursor.execute("""
SELECT name, score
FROM students
WHERE score >= ?
ORDER BY score DESC
LIMIT 3
""", (18,))یعنی:
1. فقط نمرههای ۱۸ و بالاتر
2. مرتبسازی از بیشترین به کمترین
3. فقط ۳ نتیجه
🎯 تمرین
از جدول
students، دو دانشآموز با بالاترین نمره را پیدا کن.شرایط:
ORDER BY → score نزولی
LIMIT → 2
پست ۱۸۵ از دوره جامع Python 🐍
🤖 مقایسه Claude و ChatGPT در کدنویسی Python
برای یک آزمایش، دقیقاً یک مسئله و یک درخواست یکسان را به Claude و ChatGPT دادم و از هر دو خواستم راهحل را با Python پیادهسازی کنند.
در تصاویر، خروجی و کدی که هر کدام تولید کردهاند را میتوانید ببینید. 👇
در این مقایسه میشود مواردی مثل:
🔹 ساختار و خوانایی کد
🔹 منطق حل مسئله
🔹 رعایت اصول Python
🔹 مدیریت خطاها
🔹 سادگی و قابلفهم بودن کد
را بررسی کرد.
هدف این مقایسه این نیست که بگوییم کدام مدل همیشه بهتر است؛ بلکه میخواهیم ببینیم برای یک مسئله مشخص، هر مدل چه رویکردی برای حل آن انتخاب میکند.
حالا شما کدها را ببینید و نظرتان را بگویید:
بهنظر شما کدام خروجی بهتر و حرفهایتر نوشته شده؟
🟣 Claude
🔵 ChatGPT
اولی با Claude
دومی با ChatGPT
⚠️ این تصاویر شبیه سازی شده هستند
پست مقایسه مدل های هوش مصنوعی🐍
برای یک آزمایش، دقیقاً یک مسئله و یک درخواست یکسان را به Claude و ChatGPT دادم و از هر دو خواستم راهحل را با Python پیادهسازی کنند.
در تصاویر، خروجی و کدی که هر کدام تولید کردهاند را میتوانید ببینید. 👇
در این مقایسه میشود مواردی مثل:
🔹 ساختار و خوانایی کد
🔹 منطق حل مسئله
🔹 رعایت اصول Python
🔹 مدیریت خطاها
🔹 سادگی و قابلفهم بودن کد
را بررسی کرد.
هدف این مقایسه این نیست که بگوییم کدام مدل همیشه بهتر است؛ بلکه میخواهیم ببینیم برای یک مسئله مشخص، هر مدل چه رویکردی برای حل آن انتخاب میکند.
حالا شما کدها را ببینید و نظرتان را بگویید:
بهنظر شما کدام خروجی بهتر و حرفهایتر نوشته شده؟
🟣 Claude
🔵 ChatGPT
اولی با Claude
دومی با ChatGPT
⚠️ این تصاویر شبیه سازی شده هستند
پست مقایسه مدل های هوش مصنوعی🐍
🐍 آموزش جامع Python — پست ۱۸۶
تغییر دادهها در SQLite با
تا اینجا یاد گرفتیم:
حالا میخواهیم اطلاعات موجود در جدول را تغییر دهیم.
برای این کار از:
استفاده میکنیم.
🔹 تغییر یک مقدار
فرض کنیم میخواهیم نمره
اینجا:
🔹 چرا
این کد:
میتواند نمره تمام دانشآموزان را به
اما:
فقط رکوردهای مطابق شرط را تغییر میدهد.
پس هنگام استفاده از
🔹 تغییر چند ستون
میتوانیم همزمان چند مقدار را تغییر دهیم:
در اینجا
🔹 تعداد رکوردهای تغییرکرده
بعد از
مثلاً:
یعنی یک رکورد تحت تأثیر قرار گرفته است.
⚠️ نکته مهم
مقدارها را مستقیم داخل SQL قرار نده.
❌ نامناسب:
✅ بهتر:
این روش Parameterized Query است.
🧠 خلاصه
الگوی اصلی:
🎯 تمرین
جدول
میخواهیم نمره دانشآموزی با نام
کد
را اجرا کن.
پست ۱۸۶ از دوره جامع Python 🐍
تغییر دادهها در SQLite با
UPDATEتا اینجا یاد گرفتیم:
INSERT → اضافه کردن
SELECT → خواندن
WHERE → فیلتر کردن
حالا میخواهیم اطلاعات موجود در جدول را تغییر دهیم.
برای این کار از:
UPDATE
استفاده میکنیم.
🔹 تغییر یک مقدار
فرض کنیم میخواهیم نمره
Ali را به 20 تغییر دهیم:import sqlite3
connection = sqlite3.connect("school.db")
cursor = connection.cursor()
cursor.execute(
"""
UPDATE students
SET score = ?
WHERE name = ?
""",
(20, "Ali")
)
connection.commit()
connection.close()
اینجا:
SET → مشخص میکند چه مقداری تغییر کند
WHERE → مشخص میکند کدام رکورد تغییر کند
🔹 چرا
WHERE مهم است؟این کد:
UPDATE students
SET score = 20
میتواند نمره تمام دانشآموزان را به
20 تغییر دهد.اما:
UPDATE students
SET score = 20
WHERE name = 'Ali'
فقط رکوردهای مطابق شرط را تغییر میدهد.
پس هنگام استفاده از
UPDATE باید به WHERE دقت کنیم.🔹 تغییر چند ستون
میتوانیم همزمان چند مقدار را تغییر دهیم:
cursor.execute(
"""
UPDATE students
SET name = ?, score = ?
WHERE id = ?
""",
("Ali Ahmadi", 19.5, 1)
)
connection.commit()
در اینجا
name و score رکوردی که id آن 1 است تغییر میکنند.🔹 تعداد رکوردهای تغییرکرده
بعد از
UPDATE میتوانیم بررسی کنیم چند رکورد تغییر کرده است:print(cursor.rowcount)
مثلاً:
1
یعنی یک رکورد تحت تأثیر قرار گرفته است.
⚠️ نکته مهم
مقدارها را مستقیم داخل SQL قرار نده.
❌ نامناسب:
cursor.execute(
f"UPDATE students SET score = {score} WHERE name = '{name}'"
)
✅ بهتر:
cursor.execute(
"UPDATE students SET score = ? WHERE name = ?",
(score, name)
)
این روش Parameterized Query است.
🧠 خلاصه
UPDATE → تغییر داده
SET → مقدار جدید
WHERE → تعیین رکوردهای موردنظر
الگوی اصلی:
cursor.execute(
"""
UPDATE table_name
SET column = ?
WHERE condition = ?
""",
(new_value, condition_value)
)
🎯 تمرین
جدول
students را در نظر بگیر.میخواهیم نمره دانشآموزی با نام
Sara را از هر مقداری که هست به 20 تغییر دهیم.کد
UPDATE را بنویس و در پایان:connection.commit()
را اجرا کن.
پست ۱۸۶ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۸۷
حذف رکوردها در SQLite با
در پست قبل با
حالا میخواهیم یاد بگیریم چطور یک یا چند رکورد را از جدول حذف کنیم.
برای این کار از دستور:
استفاده میکنیم.
🔹 حذف یک رکورد
فرض کنیم جدول
میتوانیم رکورد مربوط به
بعد از اجرا:
⚠️
اگر بنویسیم:
هیچ
در نتیجه تمام رکوردهای جدول حذف میشوند.
پس هنگام حذف رکورد، معمولاً باید مشخص کنیم دقیقاً کدام رکورد یا رکوردها باید حذف شوند:
🔹 حذف بر اساس
بهتر است وقتی شناسه یکتا داریم، حذف را بر اساس
🔹 بررسی تعداد رکوردهای حذفشده
میتوانیم از
اگر رکورد وجود داشته باشد:
و اگر رکوردی با این شرط پیدا نشود:
🔹 حذف چند رکورد
مثلاً تمام دانشآموزانی که نمره کمتر از
تمام رکوردهایی که شرط را داشته باشند حذف میشوند.
⚠️ از
این روش مناسب نیست:
بهجای آن از Parameterized Query استفاده کن:
این روش امنتر و استانداردتر است.
🧠 خلاصه
مثلاً:
نکات مهم:
🎯 تمرین
کد زیر را کامل کن تا دانشآموزی با
پست ۱۸۷ از دوره جامع Python 🐍
حذف رکوردها در SQLite با
DELETEدر پست قبل با
UPDATE یاد گرفتیم چطور اطلاعات یک رکورد را تغییر دهیم.حالا میخواهیم یاد بگیریم چطور یک یا چند رکورد را از جدول حذف کنیم.
برای این کار از دستور:
DELETE
استفاده میکنیم.
🔹 حذف یک رکورد
فرض کنیم جدول
students داریم:id | name | score
1 | Ali | 18
2 | Sara | 15
3 | Reza | 20
میتوانیم رکورد مربوط به
Sara را حذف کنیم:cursor.execute(
"DELETE FROM students WHERE name = ?",
("Sara",)
)
connection.commit()
بعد از اجرا:
id | name | score
1 | Ali | 18
3 | Reza | 20
⚠️
WHERE بسیار مهم استاگر بنویسیم:
DELETE FROM students;
هیچ
WHEREای وجود ندارد.در نتیجه تمام رکوردهای جدول حذف میشوند.
پس هنگام حذف رکورد، معمولاً باید مشخص کنیم دقیقاً کدام رکورد یا رکوردها باید حذف شوند:
DELETE FROM students
WHERE id = ?;
🔹 حذف بر اساس
idبهتر است وقتی شناسه یکتا داریم، حذف را بر اساس
id انجام دهیم:student_id = 3
cursor.execute(
"DELETE FROM students WHERE id = ?",
(student_id,)
)
connection.commit()
🔹 بررسی تعداد رکوردهای حذفشده
میتوانیم از
rowcount استفاده کنیم:cursor.execute(
"DELETE FROM students WHERE id = ?",
(3,)
)
connection.commit()
print(cursor.rowcount)
اگر رکورد وجود داشته باشد:
1
و اگر رکوردی با این شرط پیدا نشود:
0
🔹 حذف چند رکورد
DELETE میتواند چند رکورد را هم حذف کند.مثلاً تمام دانشآموزانی که نمره کمتر از
10 دارند:cursor.execute(
"DELETE FROM students WHERE score < ?",
(10,)
)
connection.commit()
تمام رکوردهایی که شرط را داشته باشند حذف میشوند.
⚠️ از
f-string برای SQL استفاده نکناین روش مناسب نیست:
name = input("Name: ")
cursor.execute(
f"DELETE FROM students WHERE name = '{name}'"
)بهجای آن از Parameterized Query استفاده کن:
cursor.execute(
"DELETE FROM students WHERE name = ?",
(name,)
)
این روش امنتر و استانداردتر است.
🧠 خلاصه
DELETE FROM table
WHERE condition;
مثلاً:
cursor.execute(
"DELETE FROM students WHERE id = ?",
(5,)
)
نکات مهم:
DELETE → حذف رکورد
WHERE → مشخص کردن رکوردهای موردنظر
rowcount → تعداد رکوردهای حذفشده
commit() → ذخیره تغییرات
? → پارامتر امن برای مقدار
🎯 تمرین
کد زیر را کامل کن تا دانشآموزی با
id = 2 حذف شود:import sqlite3
connection = sqlite3.connect("school.db")
cursor = connection.cursor()
cursor.execute(
"DELETE FROM students WHERE ______ = ?",
(2,)
)
connection.commit()
print(cursor.rowcount)
connection.close()
پست ۱۸۷ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۸۸
تراکنشها در SQLite |
در پستهای قبل با
حالا باید یاد بگیریم اگر چند تغییر را با هم انجام دادیم و یکی از آنها با خطا مواجه شد، چطور تغییرات را لغو کنیم.
برای این کار از مفهوم Transaction استفاده میکنیم.
🔹 Transaction چیست؟
Transaction یعنی چند عملیات مرتبط را بهعنوان یک واحد در نظر بگیریم.
مثلاً:
تا قبل از
با:
تغییرات تأیید و ذخیره میشوند.
🔹 اگر خطایی رخ دهد چه کنیم؟
میتوانیم از
اگر یکی از عملیاتها با خطا مواجه شود:
تغییرات این Transaction لغو میشوند.
🔹 تفاوت
مثلاً:
یعنی:
اما:
یعنی:
🔥 مثال کامل
در این ساختار:
و در صورت خطا:
⚠️ نکته مهم
بعد از:
دیگر نمیتوانیم همان تغییرات را با
🔹 چه زمانی Transaction مهم است؟
وقتی چند عملیات به هم وابستهاند.
مثلاً در یک سیستم بانکی فرضی:
اگر عملیات اول انجام شود ولی عملیات دوم شکست بخورد، نمیخواهیم فقط بخشی از عملیات ثبت شود.
در چنین شرایطی Transaction اهمیت زیادی دارد.
🧠 خلاصه
الگوی رایج:
🎯 تمرین
کد زیر را کامل کن تا اگر هر یک از دو عملیات با خطا مواجه شد، تغییرات لغو شوند:
باید جای خالی را با:
و:
تکمیل کنی.
پست ۱۸۸ از دوره جامع Python 🐍
تراکنشها در SQLite |
commit() و rollback()در پستهای قبل با
INSERT، UPDATE و DELETE آشنا شدیم.حالا باید یاد بگیریم اگر چند تغییر را با هم انجام دادیم و یکی از آنها با خطا مواجه شد، چطور تغییرات را لغو کنیم.
برای این کار از مفهوم Transaction استفاده میکنیم.
🔹 Transaction چیست؟
Transaction یعنی چند عملیات مرتبط را بهعنوان یک واحد در نظر بگیریم.
مثلاً:
cursor.execute(
"UPDATE students SET score = ? WHERE id = ?",
(19, 1)
)
cursor.execute(
"DELETE FROM students WHERE id = ?",
(3,)
)
connection.commit()
تا قبل از
commit()، تغییرات هنوز بهصورت نهایی ثبت نشدهاند.با:
connection.commit()
تغییرات تأیید و ذخیره میشوند.
🔹 اگر خطایی رخ دهد چه کنیم؟
میتوانیم از
rollback() استفاده کنیم:try:
cursor.execute(
"UPDATE students SET score = ? WHERE id = ?",
(19, 1)
)
cursor.execute(
"DELETE FROM students WHERE id = ?",
(3,)
)
connection.commit()
except sqlite3.Error:
connection.rollback()
اگر یکی از عملیاتها با خطا مواجه شود:
UPDATE
↓
DELETE
↓
Error
↓
rollback()
تغییرات این Transaction لغو میشوند.
🔹 تفاوت
commit() و rollback()commit() → تأیید و ذخیره تغییرات
rollback() → لغو تغییرات Transaction
مثلاً:
connection.commit()
یعنی:
تغییرات را نهایی کن.
اما:
connection.rollback()
یعنی:
تغییرات انجامشده در Transaction را برگردان.
🔥 مثال کامل
import sqlite3
connection = sqlite3.connect("school.db")
cursor = connection.cursor()
try:
cursor.execute(
"UPDATE students SET score = ? WHERE id = ?",
(20, 1)
)
cursor.execute(
"DELETE FROM students WHERE id = ?",
(3,)
)
connection.commit()
print("Transaction completed")
except sqlite3.Error as error:
connection.rollback()
print("Transaction failed:", error)
finally:
connection.close()
در این ساختار:
try
↓
اجرای عملیات
↓
commit()
↓
موفقیت
و در صورت خطا:
Exception
↓
rollback()
↓
لغو تغییرات
⚠️ نکته مهم
rollback() فقط تغییراتی را برمیگرداند که هنوز commit() نشدهاند.بعد از:
connection.commit()
دیگر نمیتوانیم همان تغییرات را با
rollback() به حالت قبل برگردانیم.🔹 چه زمانی Transaction مهم است؟
وقتی چند عملیات به هم وابستهاند.
مثلاً در یک سیستم بانکی فرضی:
کم شدن موجودی حساب A
+
اضافه شدن موجودی حساب B
اگر عملیات اول انجام شود ولی عملیات دوم شکست بخورد، نمیخواهیم فقط بخشی از عملیات ثبت شود.
در چنین شرایطی Transaction اهمیت زیادی دارد.
🧠 خلاصه
Transaction
↓
چند عملیات مرتبط
↓
موفقیت → commit()
خطا → rollback()
الگوی رایج:
try:
# database operations
connection.commit()
except sqlite3.Error:
connection.rollback()
🎯 تمرین
کد زیر را کامل کن تا اگر هر یک از دو عملیات با خطا مواجه شد، تغییرات لغو شوند:
import sqlite3
connection = sqlite3.connect("school.db")
cursor = connection.cursor()
try:
cursor.execute(
"UPDATE students SET score = ? WHERE id = ?",
(18, 1)
)
cursor.execute(
"DELETE FROM students WHERE id = ?",
(2,)
)
# تغییرات را نهایی کن
except sqlite3.Error:
# تغییرات را لغو کن
finally:
connection.close()
باید جای خالی را با:
connection.commit()
و:
connection.rollback()
تکمیل کنی.
پست ۱۸۸ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۸۹
کار با
در SQLite ممکن است بعضی ستونها مقدار نداشته باشند.
برای نمایش نبودن مقدار از:
استفاده میشود.
⚠️
🔹 ایجاد رکورد با
فرض کنیم جدول
میتوانیم دانشآموزی بدون نمره ثبت کنیم:
در Python مقدار:
به
🔹 بررسی
برای پیدا کردن رکوردهایی که مقدار
اینجا از:
استفاده میکنیم.
⚠️
این روش درست نیست:
برای بررسی
دلیلش این است که
🔹 پیدا کردن مقدارهای غیر
اگر بخواهیم فقط رکوردهایی را پیدا کنیم که نمره دارند:
یعنی:
🔹 تغییر مقدار
میتوانیم مقدار
مثلاً:
تمام دانشآموزانی که نمره نداشتند، نمره
🔹 حذف رکوردهای دارای
میتوانیم از
در اینجا تمام رکوردهایی که
🧠
وقتی با
مثلاً:
در SQLite مقدار
⚠️ نکته مهم
این مقادیر با
مثلاً:
یعنی مقدار نمره واقعاً
اما:
یعنی نمرهای ثبت نشده است.
🧠 خلاصه
و مهمتر از همه:
نه:
🎯 تمرین
کد زیر را کامل کن تا فقط دانشآموزانی که نمره ندارند نمایش داده شوند:
کلمه مناسب را جایگزین کن:
پست ۱۸۹ از دوره جامع Python 🐍
کار با
NULL در SQLite | IS NULL و IS NOT NULLدر SQLite ممکن است بعضی ستونها مقدار نداشته باشند.
برای نمایش نبودن مقدار از:
NULL
استفاده میشود.
⚠️
NULL با 0، رشته خالی "" یا False یکی نیست.🔹 ایجاد رکورد با
NULLفرض کنیم جدول
students این ستونها را دارد:id | name | score
میتوانیم دانشآموزی بدون نمره ثبت کنیم:
cursor.execute(
"INSERT INTO students (name, score) VALUES (?, ?)",
("Ali", None)
)
connection.commit()
در Python مقدار:
None
به
NULL در SQLite تبدیل میشود.🔹 بررسی
NULL با IS NULLبرای پیدا کردن رکوردهایی که مقدار
score ندارند:cursor.execute(
"SELECT * FROM students WHERE score IS NULL"
)
students = cursor.fetchall()
for student in students:
print(student)
اینجا از:
IS NULL
استفاده میکنیم.
⚠️
= NULL اشتباه استاین روش درست نیست:
WHERE score = NULL
برای بررسی
NULL باید بنویسیم:WHERE score IS NULL
دلیلش این است که
NULL به معنی نامشخص / نبود مقدار است و با مقایسه معمولی = بررسی نمیشود.🔹 پیدا کردن مقدارهای غیر
NULLاگر بخواهیم فقط رکوردهایی را پیدا کنیم که نمره دارند:
cursor.execute(
"SELECT * FROM students WHERE score IS NOT NULL"
)
students = cursor.fetchall()
یعنی:
IS NULL → مقدار وجود ندارد
IS NOT NULL → مقدار وجود دارد
🔹 تغییر مقدار
NULLمیتوانیم مقدار
NULL را هم با UPDATE تغییر دهیم.مثلاً:
cursor.execute(
"UPDATE students SET score = ? WHERE score IS NULL",
(10,)
)
connection.commit()
تمام دانشآموزانی که نمره نداشتند، نمره
10 میگیرند.🔹 حذف رکوردهای دارای
NULLمیتوانیم از
DELETE هم استفاده کنیم:cursor.execute(
"DELETE FROM students WHERE score IS NULL"
)
connection.commit()
در اینجا تمام رکوردهایی که
score آنها NULL است حذف میشوند.🧠
None در Python و NULL در SQLiteوقتی با
sqlite3 کار میکنیم:Python SQLite
None → NULL
مثلاً:
value = None
cursor.execute(
"INSERT INTO students (name, score) VALUES (?, ?)",
("Sara", value)
)
در SQLite مقدار
score برابر NULL خواهد بود.⚠️ نکته مهم
این مقادیر با
NULL متفاوتاند:NULL
0
""
False
مثلاً:
score = 0
یعنی مقدار نمره واقعاً
0 است.اما:
score = None
یعنی نمرهای ثبت نشده است.
🧠 خلاصه
None → NULL
IS NULL → پیدا کردن مقدارهای NULL
IS NOT NULL → پیدا کردن مقدارهای غیر NULL
و مهمتر از همه:
WHERE column IS NULL
نه:
WHERE column = NULL
🎯 تمرین
کد زیر را کامل کن تا فقط دانشآموزانی که نمره ندارند نمایش داده شوند:
import sqlite3
connection = sqlite3.connect("school.db")
cursor = connection.cursor()
cursor.execute(
"SELECT * FROM students WHERE score ______ NULL"
)
students = cursor.fetchall()
for student in students:
print(student)
connection.close()
کلمه مناسب را جایگزین کن:
IS
پست ۱۸۹ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۹۰
جستوجوی متنی در SQLite با
در پست قبل با
حالا میخواهیم یاد بگیریم چطور در SQLite به دنبال بخشی از یک متن بگردیم.
برای این کار از:
استفاده میکنیم.
🔹 جستوجوی متن دقیق
اگر بخواهیم نام دقیق
اما اگر فقط بخشی از نام را بدانیم،
🔹
علامت
مثلاً:
یعنی هر نامی که عبارت
مثلاً:
میتوانند با این الگو مطابقت داشته باشند.
🔹 شروع شدن با یک متن
اگر بخواهیم نامهایی را پیدا کنیم که با
مثلاً:
🔹 پایان یافتن با یک متن
اگر بخواهیم نامهایی را پیدا کنیم که به
در این حالت متن موردنظر باید در انتهای مقدار باشد.
🔹
در الگوی
مثلاً:
میتواند با نامی مثل:
مطابقت داشته باشد.
چون
🔥 مثال کامل
فرض کنیم جدول شامل این دادهها باشد:
حالا:
رکوردهایی که با
⚠️ نکته مهم: Parameterized Query
مثل همیشه بهتر است مقدار جستوجو را با
نه اینکه مقدار کاربر را مستقیماً داخل SQL قرار دهیم.
🧠 الگوهای مهم
مثلاً:
یعنی متن
🎯 تمرین
کد زیر را کامل کن تا تمام دانشآموزانی که نامشان با
الگوی مناسب را بنویس تا نامهایی که با
پست ۱۹۰ از دوره جامع Python 🐍
جستوجوی متنی در SQLite با
LIKEدر پست قبل با
NULL و IS NULL آشنا شدیم.حالا میخواهیم یاد بگیریم چطور در SQLite به دنبال بخشی از یک متن بگردیم.
برای این کار از:
LIKE
استفاده میکنیم.
🔹 جستوجوی متن دقیق
اگر بخواهیم نام دقیق
Ali را پیدا کنیم، میتوانیم از = استفاده کنیم:cursor.execute(
"SELECT * FROM students WHERE name = ?",
("Ali",)
)
اما اگر فقط بخشی از نام را بدانیم،
LIKE کاربرد دارد.🔹
% در LIKEعلامت
% یعنی هر تعداد کاراکتر.مثلاً:
cursor.execute(
"SELECT * FROM students WHERE name LIKE ?",
("%Ali%",)
)
یعنی هر نامی که عبارت
Ali را در هر جای خود داشته باشد.مثلاً:
Ali
Alireza
Mohali
میتوانند با این الگو مطابقت داشته باشند.
🔹 شروع شدن با یک متن
اگر بخواهیم نامهایی را پیدا کنیم که با
Ali شروع میشوند:cursor.execute(
"SELECT * FROM students WHERE name LIKE ?",
("Ali%",)
)
مثلاً:
Ali
Alireza
AliReza
🔹 پایان یافتن با یک متن
اگر بخواهیم نامهایی را پیدا کنیم که به
Ali ختم میشوند:cursor.execute(
"SELECT * FROM students WHERE name LIKE ?",
("%Ali",)
)
در این حالت متن موردنظر باید در انتهای مقدار باشد.
🔹
_ یعنی یک کاراکتردر الگوی
LIKE، علامت _ به معنی دقیقاً یک کاراکتر است.مثلاً:
cursor.execute(
"SELECT * FROM students WHERE name LIKE ?",
("A_i",)
)
میتواند با نامی مثل:
Ali
Ari
Ami
مطابقت داشته باشد.
چون
_ فقط یک کاراکتر را جایگزین میکند.🔥 مثال کامل
فرض کنیم جدول شامل این دادهها باشد:
Ali
Alireza
Sara
Reza
حالا:
cursor.execute(
"SELECT * FROM students WHERE name LIKE ?",
("Ali%",)
)
students = cursor.fetchall()
for student in students:
print(student)
رکوردهایی که با
Ali شروع شوند پیدا میشوند.⚠️ نکته مهم: Parameterized Query
مثل همیشه بهتر است مقدار جستوجو را با
? به Query بدهیم:name = input("Search name: ")
cursor.execute(
"SELECT * FROM students WHERE name LIKE ?",
(f"%{name}%",)
)نه اینکه مقدار کاربر را مستقیماً داخل SQL قرار دهیم.
🧠 الگوهای مهم
LIKE%Ali% → Ali در هر جای متن
Ali% → متن با Ali شروع شود
%Ali → متن با Ali تمام شود
A_i → بین A و i دقیقاً یک کاراکتر
مثلاً:
LIKE "%python%"
یعنی متن
python میتواند در هر جای مقدار قرار داشته باشد.🎯 تمرین
کد زیر را کامل کن تا تمام دانشآموزانی که نامشان با
A شروع میشود نمایش داده شوند:import sqlite3
connection = sqlite3.connect("school.db")
cursor = connection.cursor()
cursor.execute(
"SELECT * FROM students WHERE name LIKE ?",
("____",)
)
students = cursor.fetchall()
for student in students:
print(student)
connection.close()
الگوی مناسب را بنویس تا نامهایی که با
A شروع میشوند پیدا شوند.پست ۱۹۰ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۹۱
جستوجوی چند مقدار با
در پست قبل با
حالا میخواهیم ببینیم چطور میتوانیم بررسی کنیم یک ستون، یکی از چند مقدار مشخص باشد.
برای این کار از:
استفاده میکنیم.
🔹 مثال ساده
فرض کنیم میخواهیم دانشآموزانی را پیدا کنیم که نامشان
یعنی:
🔹 مقایسه با
بدون
اما
🔹 استفاده با چند مقدار
میتوانیم بیشتر از دو مقدار هم داشته باشیم:
در اینجا فقط رکوردهایی انتخاب میشوند که
🔹 استفاده با عدد
مثلاً میتوانیم چند
یعنی:
🔹 ساختن Placeholderها بهصورت پویا
گاهی تعداد مقادیر از قبل مشخص نیست.
مثلاً:
نمیتوانیم بهصورت ثابت بنویسیم:
اگر تعداد نامها تغییر کند.
میتوانیم Placeholderها را بسازیم:
در اینجا:
ساخته میشود.
⚠️ خود مقادیر همچنان با
🔹
اگر بخواهیم رکوردهایی را پیدا کنیم که مقدارشان در لیست موردنظر نباشد، از:
استفاده میکنیم.
مثلاً:
یعنی:
🔥 مثال کاربردی
فرض کنیم فقط میخواهیم دانشآموزان سه کلاس مشخص را بررسی کنیم:
این روش زمانی مفید است که تعداد مقادیر جستوجو متغیر باشد.
⚠️ نکته مهم
برای مقدارهای متغیر، از این روش استفاده نکن:
مقدارهای کاربر را مستقیماً داخل SQL قرار نده.
روش درست:
🧠 خلاصه
مثلاً:
یا:
و برای تعداد متغیر:
🎯 تمرین
کد زیر را کامل کن تا فقط دانشآموزانی که
کلمه مناسب را جایگزین کن:
پست ۱۹۱ از دوره جامع Python 🐍
جستوجوی چند مقدار با
IN در SQLiteدر پست قبل با
LIKE یاد گرفتیم چطور بخشی از یک متن را جستوجو کنیم.حالا میخواهیم ببینیم چطور میتوانیم بررسی کنیم یک ستون، یکی از چند مقدار مشخص باشد.
برای این کار از:
IN
استفاده میکنیم.
🔹 مثال ساده
فرض کنیم میخواهیم دانشآموزانی را پیدا کنیم که نامشان
Ali یا Sara است:cursor.execute(
"SELECT * FROM students WHERE name IN (?, ?)",
("Ali", "Sara")
)
students = cursor.fetchall()
for student in students:
print(student)
یعنی:
name = "Ali"
یا
name = "Sara"
🔹 مقایسه با
ORبدون
IN میتوانستیم بنویسیم:cursor.execute(
"""
SELECT * FROM students
WHERE name = ? OR name = ?
""",
("Ali", "Sara")
)
اما
IN برای این نوع جستوجو خواناتر است:cursor.execute(
"SELECT * FROM students WHERE name IN (?, ?)",
("Ali", "Sara")
)
🔹 استفاده با چند مقدار
میتوانیم بیشتر از دو مقدار هم داشته باشیم:
cursor.execute(
"SELECT * FROM students WHERE name IN (?, ?, ?)",
("Ali", "Sara", "Reza")
)
در اینجا فقط رکوردهایی انتخاب میشوند که
name یکی از این سه مقدار باشد.🔹 استفاده با عدد
IN فقط برای رشتهها نیست.مثلاً میتوانیم چند
id مشخص را پیدا کنیم:cursor.execute(
"SELECT * FROM students WHERE id IN (?, ?, ?)",
(1, 3, 5)
)
یعنی:
id = 1
یا
id = 3
یا
id = 5
🔹 ساختن Placeholderها بهصورت پویا
گاهی تعداد مقادیر از قبل مشخص نیست.
مثلاً:
names = ["Ali", "Sara", "Reza"]
نمیتوانیم بهصورت ثابت بنویسیم:
IN (?, ?, ?)
اگر تعداد نامها تغییر کند.
میتوانیم Placeholderها را بسازیم:
names = ["Ali", "Sara", "Reza"]
placeholders = ",".join("?" for _ in names)
query = f"""
SELECT * FROM students
WHERE name IN ({placeholders})
"""
cursor.execute(query, names)
در اینجا:
names = 3 مقدار
↓
?, ?, ?
ساخته میشود.
⚠️ خود مقادیر همچنان با
? به Query داده میشوند.🔹
NOT INاگر بخواهیم رکوردهایی را پیدا کنیم که مقدارشان در لیست موردنظر نباشد، از:
NOT IN
استفاده میکنیم.
مثلاً:
cursor.execute(
"SELECT * FROM students WHERE name NOT IN (?, ?)",
("Ali", "Sara")
)
یعنی:
دانشآموزانی را پیدا کن که نامشان نه
Aliباشد و نه
Sara.
🔥 مثال کاربردی
فرض کنیم فقط میخواهیم دانشآموزان سه کلاس مشخص را بررسی کنیم:
class_names = ["Python", "Django", "Flask"]
placeholders = ",".join("?" for _ in class_names)
cursor.execute(
f"""
SELECT * FROM courses
WHERE name IN ({placeholders})
""",
class_names
)
courses = cursor.fetchall()
این روش زمانی مفید است که تعداد مقادیر جستوجو متغیر باشد.
⚠️ نکته مهم
برای مقدارهای متغیر، از این روش استفاده نکن:
query = f"""
SELECT * FROM students
WHERE name IN ({names})
"""
مقدارهای کاربر را مستقیماً داخل SQL قرار نده.
روش درست:
placeholders = ",".join("?" for _ in names)
cursor.execute(
f"SELECT * FROM students WHERE name IN ({placeholders})",
names
)🧠 خلاصه
IN → یکی از چند مقدار
NOT IN → هیچکدام از چند مقدار
مثلاً:
WHERE id IN (?, ?, ?)
یا:
WHERE name NOT IN (?, ?)
و برای تعداد متغیر:
placeholders = ",".join("?" for _ in values)🎯 تمرین
کد زیر را کامل کن تا فقط دانشآموزانی که
id آنها 1، 3 یا 5 است نمایش داده شوند:import sqlite3
connection = sqlite3.connect("school.db")
cursor = connection.cursor()
ids = [1, 3, 5]
placeholders = ",".join("?" for _ in ids)
cursor.execute(
f"""
SELECT * FROM students
WHERE id ______ ({placeholders})
""",
ids
)
students = cursor.fetchall()
for student in students:
print(student)
connection.close()
کلمه مناسب را جایگزین کن:
IN
پست ۱۹۱ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۹۲
محاسبه اطلاعات آماری با
تا اینجا بیشتر با دریافت و تغییر رکوردها کار کردیم.
اما در پروژههای واقعی گاهی لازم است بهجای نمایش تکتک رکوردها، روی دادهها محاسبه انجام دهیم.
SQLite چند تابع مهم برای این کار دارد:
در این پست با سه مورد اول آشنا میشویم.
🔹
مثلاً تعداد دانشآموزان:
اگر 10 دانشآموز داشته باشیم:
🔹 چرا
چون
به همین دلیل:
عدد
🔹 شمارش با شرط
میتوانیم فقط رکوردهایی را بشماریم که یک شرط مشخص دارند.
مثلاً تعداد دانشآموزانی که نمره حداقل
🔹
مثلاً مجموع نمرهها:
اگر نمرهها:
باشند:
🔹
برای نمرههای:
نتیجه:
🔥 ترکیب چند تابع
میتوانیم چند تابع آماری را در یک Query استفاده کنیم:
مثلاً:
🔹 استفاده همراه با
میتوانیم محاسبات را فقط روی رکوردهای موردنظر انجام دهیم:
در اینجا فقط دانشآموزانی که نمرهشان حداقل
⚠️ نکته مهم درباره
در بسیاری از توابع آماری SQLite، مقدارهای
مثلاً اگر داشته باشیم:
اما:
تعداد تمام رکوردها را میشمارد.
این موضوع را با:
میتوانیم مقایسه کنیم:
🧠 خلاصه
مثلاً:
یا:
یا:
🎯 تمرین
کد زیر را کامل کن تا تعداد دانشآموزان، مجموع نمرهها و میانگین نمرهها را نمایش دهد:
جای خالیها را با توابع مناسب پر کن.
پست ۱۹۲ از دوره جامع Python 🐍
محاسبه اطلاعات آماری با
COUNT، SUM و AVG در SQLiteتا اینجا بیشتر با دریافت و تغییر رکوردها کار کردیم.
اما در پروژههای واقعی گاهی لازم است بهجای نمایش تکتک رکوردها، روی دادهها محاسبه انجام دهیم.
SQLite چند تابع مهم برای این کار دارد:
COUNT
SUM
AVG
MIN
MAX
در این پست با سه مورد اول آشنا میشویم.
🔹
COUNTCOUNT برای شمارش رکوردها استفاده میشود.مثلاً تعداد دانشآموزان:
cursor.execute(
"SELECT COUNT(*) FROM students"
)
result = cursor.fetchone()
print(result[0])
اگر 10 دانشآموز داشته باشیم:
10
🔹 چرا
fetchone()؟چون
COUNT(*) فقط یک نتیجه برمیگرداند:(10,)
به همین دلیل:
result[0]
عدد
10 را از Tuple دریافت میکند.🔹 شمارش با شرط
میتوانیم فقط رکوردهایی را بشماریم که یک شرط مشخص دارند.
مثلاً تعداد دانشآموزانی که نمره حداقل
18 دارند:cursor.execute(
"SELECT COUNT(*) FROM students WHERE score >= ?",
(18,)
)
count = cursor.fetchone()[0]
print(count)
🔹
SUMSUM مجموع مقدارهای یک ستون را محاسبه میکند.مثلاً مجموع نمرهها:
cursor.execute(
"SELECT SUM(score) FROM students"
)
total_score = cursor.fetchone()[0]
print(total_score)
اگر نمرهها:
18
15
20
17
باشند:
70
🔹
AVGAVG میانگین مقدارهای یک ستون را محاسبه میکند.cursor.execute(
"SELECT AVG(score) FROM students"
)
average_score = cursor.fetchone()[0]
print(average_score)
برای نمرههای:
18
15
20
17
نتیجه:
17.5
🔥 ترکیب چند تابع
میتوانیم چند تابع آماری را در یک Query استفاده کنیم:
cursor.execute(
"""
SELECT
COUNT(*),
SUM(score),
AVG(score)
FROM students
"""
)
result = cursor.fetchone()
print("Count:", result[0])
print("Total:", result[1])
print("Average:", result[2])
مثلاً:
Count: 4
Total: 70
Average: 17.5
🔹 استفاده همراه با
WHEREمیتوانیم محاسبات را فقط روی رکوردهای موردنظر انجام دهیم:
cursor.execute(
"""
SELECT AVG(score)
FROM students
WHERE score >= ?
""",
(10,)
)
average = cursor.fetchone()[0]
print(average)
در اینجا فقط دانشآموزانی که نمرهشان حداقل
10 است در محاسبه میانگین قرار میگیرند.⚠️ نکته مهم درباره
NULLدر بسیاری از توابع آماری SQLite، مقدارهای
NULL در محاسبات عددی نادیده گرفته میشوند.مثلاً اگر داشته باشیم:
18
15
NULL
17
AVG(score) میانگین سه مقدار عددی را محاسبه میکند، نه چهار مقدار.اما:
COUNT(*)
تعداد تمام رکوردها را میشمارد.
این موضوع را با:
COUNT(score)
میتوانیم مقایسه کنیم:
cursor.execute(
"""
SELECT COUNT(*), COUNT(score)
FROM students
"""
)
result = cursor.fetchone()
print("All rows:", result[0])
print("Rows with score:", result[1])
COUNT(score) فقط مقدارهای غیر NULL را میشمارد.🧠 خلاصه
COUNT(*) → تعداد رکوردها
SUM() → مجموع
AVG() → میانگین
مثلاً:
SELECT COUNT(*) FROM students;
یا:
SELECT SUM(score) FROM students;
یا:
SELECT AVG(score) FROM students;
🎯 تمرین
کد زیر را کامل کن تا تعداد دانشآموزان، مجموع نمرهها و میانگین نمرهها را نمایش دهد:
import sqlite3
connection = sqlite3.connect("school.db")
cursor = connection.cursor()
cursor.execute(
"""
SELECT
COUNT(*),
______(score),
______(score)
FROM students
"""
)
result = cursor.fetchone()
print("Count:", result[0])
print("Total:", result[1])
print("Average:", result[2])
connection.close()
جای خالیها را با توابع مناسب پر کن.
پست ۱۹۲ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۹۳
پیدا کردن کمترین و بیشترین مقدار با
در پست قبل با توابع آماری:
آشنا شدیم.
حالا دو تابع بسیار کاربردی دیگر را یاد میگیریم:
🔹
تابع
مثلاً کمترین نمره:
اگر نمرهها اینها باشند:
خروجی:
🔹
تابع
خروجی:
🔹 استفاده با
مثل سایر توابع آماری، میتوانیم شرط هم داشته باشیم.
مثلاً بیشترین نمره بین دانشآموزانی که نمرهشان حداقل
🔥 استفاده از چند تابع با هم
میتوانیم کمترین، بیشترین و میانگین را در یک Query دریافت کنیم:
مثلاً:
🔹
این توابع میتوانند روی دادههای متنی هم استفاده شوند.
مثلاً:
در این حالت SQLite بر اساس ترتیب مقایسه رشتهها، مقدار حداقل و حداکثر را تعیین میکند.
⚠️ نکته مهم درباره
در محاسباتی مانند:
مقدارهای
مثلاً اگر:
داشته باشیم:
🔹 پیدا کردن رکورد مربوط به بیشترین نمره
اگر بخواهیم اطلاعات دانشآموزی که بیشترین نمره را دارد هم دریافت کنیم، میتوانیم از:
مثلاً:
اگر چند دانشآموز بالاترین نمره یکسان داشته باشند، همه آنها میتوانند برگردانده شوند.
🧠 خلاصه
مثلاً:
🎯 تمرین
کد زیر را کامل کن تا کمترین و بیشترین قیمت محصولات را پیدا کند:
توابع مناسب را جایگزین کن.
پست ۱۹۳ از دوره جامع Python 🐍
پیدا کردن کمترین و بیشترین مقدار با
MIN و MAX در SQLiteدر پست قبل با توابع آماری:
COUNT
SUM
AVG
آشنا شدیم.
حالا دو تابع بسیار کاربردی دیگر را یاد میگیریم:
MIN
MAX
🔹
MINتابع
MIN() کمترین مقدار یک ستون را برمیگرداند.مثلاً کمترین نمره:
cursor.execute(
"SELECT MIN(score) FROM students"
)
minimum = cursor.fetchone()[0]
print(minimum)
اگر نمرهها اینها باشند:
18
15
20
17
خروجی:
15
🔹
MAXتابع
MAX() بیشترین مقدار یک ستون را برمیگرداند.cursor.execute(
"SELECT MAX(score) FROM students"
)
maximum = cursor.fetchone()[0]
print(maximum)
خروجی:
20
🔹 استفاده با
WHEREمثل سایر توابع آماری، میتوانیم شرط هم داشته باشیم.
مثلاً بیشترین نمره بین دانشآموزانی که نمرهشان حداقل
10 است:cursor.execute(
"""
SELECT MAX(score)
FROM students
WHERE score >= ?
""",
(10,)
)
maximum = cursor.fetchone()[0]
print(maximum)
🔥 استفاده از چند تابع با هم
میتوانیم کمترین، بیشترین و میانگین را در یک Query دریافت کنیم:
cursor.execute(
"""
SELECT
MIN(score),
MAX(score),
AVG(score)
FROM students
"""
)
result = cursor.fetchone()
print("Minimum:", result[0])
print("Maximum:", result[1])
print("Average:", result[2])
مثلاً:
Minimum: 15
Maximum: 20
Average: 17.5
🔹
MIN و MAX فقط برای عدد نیستنداین توابع میتوانند روی دادههای متنی هم استفاده شوند.
مثلاً:
cursor.execute(
"SELECT MIN(name), MAX(name) FROM students"
)
result = cursor.fetchone()
print(result)
در این حالت SQLite بر اساس ترتیب مقایسه رشتهها، مقدار حداقل و حداکثر را تعیین میکند.
⚠️ نکته مهم درباره
NULLدر محاسباتی مانند:
MIN(score)
MAX(score)
AVG(score)
SUM(score)
مقدارهای
NULL در محاسبه نادیده گرفته میشوند.مثلاً اگر:
18
NULL
15
20
داشته باشیم:
MIN → 15
MAX → 20
AVG → میانگین 18، 15 و 20
🔹 پیدا کردن رکورد مربوط به بیشترین نمره
MAX(score) فقط خود مقدار را برمیگرداند.اگر بخواهیم اطلاعات دانشآموزی که بیشترین نمره را دارد هم دریافت کنیم، میتوانیم از:
cursor.execute(
"""
SELECT name, score
FROM students
WHERE score = (SELECT MAX(score) FROM students)
"""
)
students = cursor.fetchall()
for student in students:
print(student)
مثلاً:
('Reza', 20)اگر چند دانشآموز بالاترین نمره یکسان داشته باشند، همه آنها میتوانند برگردانده شوند.
🧠 خلاصه
COUNT() → تعداد
SUM() → مجموع
AVG() → میانگین
MIN() → کمترین مقدار
MAX() → بیشترین مقدار
مثلاً:
SELECT MIN(score), MAX(score)
FROM students;
🎯 تمرین
کد زیر را کامل کن تا کمترین و بیشترین قیمت محصولات را پیدا کند:
import sqlite3
connection = sqlite3.connect("shop.db")
cursor = connection.cursor()
cursor.execute(
"""
SELECT
______(price),
______(price)
FROM products
"""
)
result = cursor.fetchone()
print("Minimum:", result[0])
print("Maximum:", result[1])
connection.close()
توابع مناسب را جایگزین کن.
پست ۱۹۳ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۱۹۴
گروهبندی دادهها با
تا اینجا با توابعی مثل:
کار کردیم.
اما گاهی نمیخواهیم این محاسبات را روی کل جدول انجام دهیم؛ بلکه میخواهیم دادهها را بر اساس یک ستون گروهبندی کنیم.
برای این کار از:
استفاده میکنیم.
🔹
فرض کنیم جدول
اگر بخواهیم میانگین نمره هر کلاس را محاسبه کنیم:
خروجی:
SQLite ابتدا رکوردها را بر اساس
🔹 تعداد اعضای هر گروه
میتوانیم از
مثلاً تعداد دانشآموزان هر کلاس:
خروجی:
🔹 مجموع هر گروه با
مثلاً مجموع نمرههای هر کلاس:
خروجی:
🔥 ترکیب چند تابع
میتوانیم چند محاسبه را همزمان انجام دهیم:
هر ردیف نتیجه شامل اطلاعات آماری یک کلاس خواهد بود.
🔹
میتوانیم بیشتر از یک ستون را هم گروهبندی کنیم.
مثلاً:
در این حالت گروهها بر اساس ترکیب:
تشکیل میشوند.
🔹 تفاوت
این دو وظیفه متفاوتی دارند.
اما:
رکوردهای باقیمانده را گروهبندی میکند.
مثلاً:
ترتیب منطقی:
یعنی ابتدا رکوردهای نامعتبر حذف میشوند، سپس دادههای باقیمانده گروهبندی و محاسبه میشوند.
⚠️ نکته مهم
وقتی از
نه اینکه یک ستون نامرتبط را بدون دلیل وارد نتیجه کنیم.
🧠 خلاصه
مثلاً:
یعنی:
🎯 تمرین
جدول
کد را کامل کن تا میانگین قیمت هر دستهبندی نمایش داده شود:
دو جای خالی را کامل کن.
پست ۱۹۴ از دوره جامع Python 🐍
گروهبندی دادهها با
GROUP BY در SQLiteتا اینجا با توابعی مثل:
COUNT()
SUM()
AVG()
MIN()
MAX()
کار کردیم.
اما گاهی نمیخواهیم این محاسبات را روی کل جدول انجام دهیم؛ بلکه میخواهیم دادهها را بر اساس یک ستون گروهبندی کنیم.
برای این کار از:
GROUP BY
استفاده میکنیم.
🔹
GROUP BY چیست؟فرض کنیم جدول
students شامل این اطلاعات باشد:name | class | score
Ali | Python | 18
Sara | Python | 20
Reza | Django | 15
Mina | Django | 17
اگر بخواهیم میانگین نمره هر کلاس را محاسبه کنیم:
cursor.execute(
"""
SELECT class, AVG(score)
FROM students
GROUP BY class
"""
)
results = cursor.fetchall()
for row in results:
print(row)
خروجی:
('Django', 16.0)
('Python', 19.0)SQLite ابتدا رکوردها را بر اساس
class گروهبندی میکند و سپس AVG() را برای هر گروه محاسبه میکند.🔹 تعداد اعضای هر گروه
میتوانیم از
COUNT() هم استفاده کنیم.مثلاً تعداد دانشآموزان هر کلاس:
cursor.execute(
"""
SELECT class, COUNT(*)
FROM students
GROUP BY class
"""
)
results = cursor.fetchall()
for row in results:
print(row)
خروجی:
('Django', 2)
('Python', 2)🔹 مجموع هر گروه با
SUM()مثلاً مجموع نمرههای هر کلاس:
cursor.execute(
"""
SELECT class, SUM(score)
FROM students
GROUP BY class
"""
)
results = cursor.fetchall()
for row in results:
print(row)
خروجی:
('Django', 32)
('Python', 38)🔥 ترکیب چند تابع
میتوانیم چند محاسبه را همزمان انجام دهیم:
cursor.execute(
"""
SELECT
class,
COUNT(*),
AVG(score),
MIN(score),
MAX(score)
FROM students
GROUP BY class
"""
)
results = cursor.fetchall()
for row in results:
print(row)
هر ردیف نتیجه شامل اطلاعات آماری یک کلاس خواهد بود.
🔹
GROUP BY با چند ستونمیتوانیم بیشتر از یک ستون را هم گروهبندی کنیم.
مثلاً:
cursor.execute(
"""
SELECT class, gender, COUNT(*)
FROM students
GROUP BY class, gender
"""
)
در این حالت گروهها بر اساس ترکیب:
class + gender
تشکیل میشوند.
🔹 تفاوت
WHERE و GROUP BYاین دو وظیفه متفاوتی دارند.
WHERE ابتدا رکوردها را فیلتر میکند:WHERE score >= 10
اما:
GROUP BY class
رکوردهای باقیمانده را گروهبندی میکند.
مثلاً:
cursor.execute(
"""
SELECT class, AVG(score)
FROM students
WHERE score >= ?
GROUP BY class
""",
(10,)
)
ترتیب منطقی:
FROM
↓
WHERE
↓
GROUP BY
↓
AVG()
یعنی ابتدا رکوردهای نامعتبر حذف میشوند، سپس دادههای باقیمانده گروهبندی و محاسبه میشوند.
⚠️ نکته مهم
وقتی از
GROUP BY استفاده میکنیم، معمولاً ستون گروهبندیشده را همراه با یک تابع تجمیعی (Aggregate Function) انتخاب میکنیم:SELECT class, AVG(score)
FROM students
GROUP BY class;
نه اینکه یک ستون نامرتبط را بدون دلیل وارد نتیجه کنیم.
🧠 خلاصه
GROUP BY → گروهبندی رکوردها
COUNT() → تعداد هر گروه
SUM() → مجموع هر گروه
AVG() → میانگین هر گروه
MIN() → کمترین مقدار هر گروه
MAX() → بیشترین مقدار هر گروه
مثلاً:
SELECT class, AVG(score)
FROM students
GROUP BY class;
یعنی:
میانگین نمره را برای هر کلاس جداگانه محاسبه کن.
🎯 تمرین
جدول
products را در نظر بگیر:name | category | price
Laptop | PC | 1200
Mouse | PC | 50
Phone | Mobile | 800
Tablet | Mobile | 500
کد را کامل کن تا میانگین قیمت هر دستهبندی نمایش داده شود:
cursor.execute(
"""
SELECT category, ______(price)
FROM products
GROUP BY ______
"""
)
دو جای خالی را کامل کن.
پست ۱۹۴ از دوره جامع Python 🐍