مقدمه
پایتون به واسطه سادگی و انعطافپذیری، امروزه به یکی از زبانهای قدرتمند برنامهنویسی برای توسعه انواع نرمافزارها و برنامههای کاربردی تبدیل شدهاست. اغلب برنامههای کاربردی نیازمند ذخیره، بازیابی و پردازش دادهها هستند و اینجاست که کار با دیتابیس (پایگاه داده) اهمیت پیدا میکند. یادگیری کار با دیتابیس در پایتون یک مهارت اساسی برای تمام برنامهنویسان است. در این مقاله قصد داریم به صورت جامع و با مثالهای کاربردی، نحوه اتصال و کار با دیتابیسهای مختلف مانند SQLite، MySQL و PostgreSQL را آموزش دهیم.
مبانی پایگاه داده و انواع آن
پایگاههای داده (Databases) سیستمهایی برای ذخیره، مدیریت و بازیابی دادهها هستند. رایجترین دستهبندی پایگاههای داده عبارتند از:
- پایگاه داده رابطهای (Relational) مثل MySQL، PostgreSQL، SQLite
- پایگاه داده غیررابطهای (NoSQL) مثل MongoDB، Redis
در این مقاله تمرکز ما بر کار با پایگاههای داده رابطهای در پایتون است.
اتصال به دیتابیس در پایتون
پایتون از کتابخانهها و بستههای مختلفی برای تعامل با انواع دیتابیسها پشتیبانی میکند. در ادامه برخی از مهمترین کتابخانهها آورده شدهاند:
- sqlite3: کتابخانه داخلی پایتون برای کار با دیتابیسهای SQLite
- mysql-connector-python: برای ارتباط با MySQL
- psycopg2: برای کار با PostgreSQL
- SQLAlchemy: یک ORM (Object Relational Mapper) قدرتمند برای انتزاع تعامل با انواع پایگاه داده
۱. کار با دیتابیس SQLite
SQLite یک سیستم مدیریت دیتابیس سبک و داخلی است که فایل دیتابیس را به صورت لوکال ذخیره میکند. برای استفاده از آن در پایتون کافی است از ماژول sqlite3 استفاده کنید. نمونه کد زیر را ببینید:
import sqlite3
# اتصال به دیتابیس (اگر وجود نداشته باشد ساخته میشود)
conn = sqlite3.connect('mydatabase.db')
cur = conn.cursor()
# ساخت یک جدول ساده
cur.execute('''CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
email TEXT UNIQUE
)''')
# افزودن یک کاربر جدید
cur.execute('INSERT INTO users (name, email) VALUES (?, ?)', ('علی', 'ali@email.com'))
# ذخیره تغییرات
conn.commit()
# واکشی دادهها
cur.execute('SELECT * FROM users')
rows = cur.fetchall()
for row in rows:
print(row)
# بستن اتصال دیتابیس
conn.close()
در این مثال با نحوه ایجاد، افزودن داده، بازیابی (SELECT) و بستن ارتباط با دیتابیس SQLite آشنا شدیم.
۲. کار با دیتابیس MySQL
برای اتصال پایتون به MySQL معمولاً از کتابخانه mysql-connector-python یا PyMySQL استفاده میشود.
pip install mysql-connector-python
import mysql.connector
# اتصال به دیتابیس
conn = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database='testdb'
)
cursor = conn.cursor()
# ایجاد جدول
cursor.execute('''CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255) UNIQUE
)''')
# افزودن داده
cursor.execute('INSERT INTO users (name, email) VALUES (%s, %s)', ('رضا', 'reza@example.com'))
conn.commit()
# خواندن دادهها
cursor.execute('SELECT * FROM users')
results = cursor.fetchall()
for row in results:
print(row)
# بستن اتصال
cursor.close()
conn.close()
همانطور که میبینید نحوه کار بسیار مشابه SQLite است، با این تفاوت که باید اطلاعات اتصال را نیز تعریف کرد.
۳. کار با دیتابیس PostgreSQL
برای کار با PostgreSQL از کتابخانه psycopg2 بهره میبریم:
pip install psycopg2
import psycopg2
# اتصال به دیتابیس
conn = psycopg2.connect(
host='localhost',
user='your_username',
password='your_password',
dbname='testdb'
)
cursor = conn.cursor()
# ایجاد جدول
cursor.execute('''CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100) UNIQUE
)''')
# افزودن داده
cursor.execute('INSERT INTO users (name, email) VALUES (%s, %s)', ('محمد', 'mohammad@example.com'))
conn.commit()
# نمایش دادهها
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:
print(row)
# بستن ارتباط
cursor.close()
conn.close()
در همه مثالها ساختار مشابهی برای عملیات CRUD مشاهده میشود.
۴. کار با SQLAlchemy (ORM)
SQLAlchemy یک ORM منعطف است که امکان کار هدفمند و شیءگرا با دیتابیسهای مختلف را فراهم میسازد.
pip install sqlalchemy
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String, unique=True)
# ایجاد انجین (Engine)
engine = create_engine('sqlite:///orm_database.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# افزودن رکورد جدید
new_user = User(name='سارا', email='sara@email.com')
session.add(new_user)
session.commit()
# بازیابی دادهها
users = session.query(User).all()
for user in users:
print(user.name, user.email)
session.close()
این مثال قدرت برنامهنویسی سطح بالا و شی گرا را برای کار با دیتابیسها نمایش میدهد و مهاجرت میان دیتابیسهای مختلف را آسان میکند.
اصول امنیتی در کار با دیتابیس
هنگام برنامهنویسی با دیتابیس همیشه باید به اصول امنیتی زیر توجه ویژه داشت:
- استفاده از پارامترها برای جلوگیری از SQL Injection
- عدم ذخیره رمز عبور دیتابیس به صورت صریح در کدها
- مدیریت درست اتصال و بستن Connection پس از اتمام کار
- کنترل دسترسی کاربران و محدودسازی سطوح دسترسی
سوالات متداول
آیا پایتون از همه دیتابیسها پشتیبانی میکند؟
تقریباً برای بیشتر دیتابیسهای مشهور کتابخانههایی در پایتون وجود دارد که امکان اتصال را فراهم میکنند.
فرق اصلی بین کار با ORM و کار مستقیم با SQL چیست؟
ORM مانند SQLAlchemy امکان کار سطح بالا و شیءگرا را میدهد؛ اما گاهی اوقات برای کارهای پیچیده یا بهبود کارایی بهتر است مستقیم از دستورات SQL استفاده شود.
چند توصیه برای کار حرفهای با دیتابیس در پایتون
- استفاده از context manager (مثلاً with … as …) برای مدیریت اتصال
- فعالسازی لاگینگ برای ردیابی خطاها
- مدیریت موثر خطاها (Error Handling)
جمعبندی
کار با دیتابیس در پایتون انعطاف، کارایی و سرعت توسعه بسیار بالایی را ممکن میسازد؛ چه با دیتابیس داخلی مانند SQLite و چه با دیتابیسهای قدرتمندی مانند MySQL و PostgreSQL. استفاده از ORM ها نیز میتواند فرآیند توسعه و نگهداری را تسهیل کند. با رعایت اصول امنیتی، مدیریت موثر اتصال و یادگیری اصول بنیادی، به راحتی میتوانید سیستمهای اطلاعاتی پرقدرتی با پایتون پیاده سازی نمایید.