انتقال داده‌ها از SQLite به MySQL با پایتون

انتقال داده‌ها از SQLite به MySQL با پایتون

چرا باید از انتقال داده‌ها از SQLite به MySQL استفاده کرد؟

در دنیای داده‌های دیجیتالی امروز، مدیریت و انتقال اطلاعات بین سیستم‌های مختلف پایگاه داده اهمیت فزاینده‌ای پیدا کرده است. SQLite و MySQL دو سیستم مدیریت پایگاه داده محبوب هستند که هر یک ویژگی‌ها و کاربردهای خاص خود را دارند. SQLite، یک پایگاه داده سبک و فایل محور است که عمدتاً برای برنامه‌های کاربردی محلی و توسعه نرم‌افزار استفاده می‌شود. از طرف دیگر، MySQL یک سیستم پایگاه داده مبتنی بر سرور است که برای برنامه‌های کاربردی تحت وب و پروژه‌هایی با حجم بالاتر مناسب است.

انتقال داده‌ها از SQLite به MySQL می‌تواند به دلایل مختلفی مورد نیاز باشد، مانند ارتقاء پروژه از یک محیط توسعه به یک محیط تولید، افزایش نیازهای مقیاس‌پذیری و عملکرد، یا نیاز به ویژگی‌های پیشرفته‌تر مدیریت داده که در MySQL ارائه می‌شود.

def transfer_data(sqlite_db_path, mysql_config):
    try:
        # Connect to SQLite database
        sqlite_conn = sqlite3.connect(sqlite_db_path)
        cursor = sqlite_conn.cursor()
        cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
        tables = cursor.fetchall()

        # Connect to MySQL database
        mysql_conn = mysql.connector.connect(**mysql_config)
        mysql_cursor = mysql_conn.cursor()

        for table in tables:
            table_name = table[0]
            cursor.execute(f"SELECT * FROM {table_name}")
            rows = cursor.fetchall()

            # Retrieving column names from SQLite table
            cursor.execute(f"PRAGMA table_info({table_name})")
            columns = [column[1] for column in cursor.fetchall()]
            column_names = ', '.join(columns)

            # Creating table in MySQL if it doesn't exist
            cursor.execute(f"PRAGMA table_info({table_name})")
            column_definitions = ', '.join([f"{column[1]} {column[2]}" for column in cursor.fetchall()])
            mysql_cursor.execute(f"CREATE TABLE IF NOT EXISTS {table_name} ({column_definitions})")

            # Inserting data into MySQL table
            placeholders = ', '.join(['%s'] * len(columns))
            mysql_query = f"INSERT INTO {table_name} ({column_names}) VALUES ({placeholders})"
            for row in rows:
                mysql_cursor.execute(mysql_query, row)

            mysql_conn.commit()

        print(f"Data transferred successfully from SQLite to MySQL for all tables.")

    except Error as e:
        print(f"Error: {e}")

    finally:
        if sqlite_conn:
            sqlite_conn.close()
        if mysql_conn:
            mysql_conn.close()

# Example usage
sqlite_db_path = 'path_to_your_sqlite_db.db'
mysql_config = {
    'host': 'your_mysql_host',
    'user': 'your_mysql_user',
    'password': 'your_mysql_password',
    'database': 'your_mysql_database'
}

transfer_data(sqlite_db_path, mysql_config)

 

توضیحات کد انتقال داده‌ها

تابع transfer_data

این تابع دو پارامتر دریافت می‌کند:

  • sqlite_db_path: مسیر فایل پایگاه داده SQLite.
  • mysql_config: یک دیکشنری حاوی تنظیمات اتصال به پایگاه داده MySQL (مانند میزبان، کاربر، رمز عبور و نام پایگاه داده).

بلوک Try-Except-Finally

این ساختار برای مدیریت خطاها در پایتون استفاده می‌شود:

  • try: بلوک کدی که ممکن است خطا تولید کند.
  • except: بلوک کدی که اجرا می‌شود اگر خطایی در بلوک try رخ دهد.
  • finally: بلوک کدی که پس از اجرای بلوک‌های try و except، صرف نظر از اینکه خطایی رخ داده باشد یا نه، اجرا می‌شود.

اتصال به پایگاه داده‌ها

  1. اتصال به SQLite:
    • sqlite_conn = sqlite3.connect(sqlite_db_path): ایجاد اتصال به پایگاه داده SQLite.
    • cursor = sqlite_conn.cursor(): ایجاد یک کرسر برای اجرای دستورات SQL.
  2. خواندن لیست جداول SQLite:
    • cursor.execute("SELECT name FROM sqlite_master WHERE type='table';"): اجرای کوئری SQL برای دریافت نام تمام جداول در پایگاه داده SQLite.
    • tables = cursor.fetchall(): ذخیره نتایج کوئری.
  3. اتصال به MySQL:
    • mysql_conn = mysql.connector.connect(**mysql_config): ایجاد اتصال به پایگاه داده MySQL با استفاده از تنظیمات موجود در mysql_config.
    • mysql_cursor = mysql_conn.cursor(): ایجاد یک کرسر برای اجرای دستورات SQL در MySQL.

انتقال داده‌ها

  1. پیمایش تمام جداول SQLite:
    • for table in tables:حلقه برای پیمایش در تمام جداول دریافت شده از پایگاه داده SQLite.
  2. خواندن و انتقال داده‌ها برای هر جدول:
    • table_name = table[0]: استخراج نام جدول.
    • cursor.execute(f"SELECT * FROM {table_name}"): اجرای کوئری برای خواندن تمام داده‌ها از جدول جاری در SQLite.
    • rows = cursor.fetchall(): ذخیره سازی ردیف‌های خوانده شده.
  3. استخراج نام‌های ستون‌ها از جدول SQLite:
    • cursor.execute(f"PRAGMA table_info({table_name})"): دریافت اطلاعات ستون‌های جدول.
    • columns = [column[1] for column in cursor.fetchall()]: استخراج نام‌های ستون‌ها.
    • column_names = ', '.join(columns): ترکیب نام‌های ستون برای استفاده در کوئری‌های SQL.
  4. ایجاد جدول در MySQL در صورت نبودن:
    • cursor.execute(f"PRAGMA table_info({table_name})"): مجدداً دریافت اطلاعات ستون‌های جدول.
    • column_definitions = ', '.join([f"{column[1]} {column[2]}" for column in cursor.fetchall()]): تعریف ستون‌ها برای ساخت جدول.
    • mysql_cursor.execute(f"CREATE TABLE IF NOT EXISTS {table_name} ({column_definitions})"): ایجاد جدول در MySQL با استفاده از تعریف ستون‌های مشابه SQLite.
  5. وارد کردن داده‌ها به جدول MySQL:
    • placeholders = ', '.join(['%s'] * len(columns)): ایجاد رشته‌ای از placeholderها برای استفاده در کوئری INSERT.
    • mysql_query = f"INSERT INTO {table_name} ({column_names}) VALUES ({placeholders})": تعریف کوئری INSERT.
    • for row in rows: حلقه برای وارد کردن هر ردیف از داده‌های SQLite به جدول MySQL.
    • mysql_cursor.execute(mysql_query, row): اجرای کوئری INSERT برای هر ردیف.
  6. تأیید تغییراتدر پایگاه داده MySQL:
    • mysql_conn.commit(): این دستور تغییرات انجام شده را در پایگاه داده MySQL ثبت (commit) می‌کند. این اطمینان می‌دهد که تمام داده‌های وارد شده به طور دائمی در پایگاه داده ذخیره می‌شوند.

مدیریت خطا و بستن اتصالات

  1. مدیریت خطا:
    • except Error as e: اگر در هر نقطه‌ای از اجرای کد خطایی رخ دهد، این بلوک کد اجرا می‌شود و خطا چاپ می‌شود. این به تشخیص و رفع مشکلات کمک می‌کند.
  2. بستن اتصالات:
    • finally: این بلوک کد صرف نظر از اینکه کد به صورت موفقیت‌آمیز اجرا شده باشد یا خطایی رخ داده باشد، اجرا می‌شود.
    • if sqlite_conn: sqlite_conn.close(): بستن اتصال به پایگاه داده SQLite.
    • if mysql_conn: mysql_conn.close(): بستن اتصال به پایگاه داده MySQL.

نکته:
اگر می خواهید که فقط یک تیبل خاص از sqlite انتخاب کنید کافی است که کد زیر را جایگزین کنید

cursor.execute(“SELECT name FROM sqlite_master WHERE name=’table_name’;”)

چرا این کد مهم است؟

این کد برای مواردی که نیاز به انتقال داده‌ها از یک پایگاه داده سبک و محلی به یک پایگاه داده مبتنی بر سرور با قابلیت‌های پیشرفته‌تر وجود دارد، ایده‌آل است. برای مثال، یک توسعه‌دهنده ممکن است یک برنامه را با استفاده از SQLite توسعه دهد و بعداً برای مقیاس‌بندی و استفاده در محیط‌های تولیدی نیاز به انتقال داده‌ها به MySQL داشته باشد.

علاوه بر این، این کد برای تضمین یکپارچگی داده‌ها و کاهش خطرات ناشی از دستی کار کردن حین انتقال داده‌ها ضروری است. انتقال داده‌ها به صورت خودکار از طریق یک اسکریپت، خطای انسانی را کاهش داده و اطمینان می‌دهد که تمام داده‌ها به درستی و بدون از دست دادن اطلاعات منتقل شوند.

Responses

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Responses

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

List Comprehensions در پایتون

List Comprehensions در پایتون

List Comprehensions در پایتون، یک روش سریع و موثر برای ایجاد لیست‌ها از طریق اعمال عملیات و فیلترها بر روی تکرارپذیرها (iterables) است. این ویژگی

تشخیص شماره موبایل با پایتون

تشخیص شماره موبایل در متن با پایتون

برای تشخیص شماره‌های تلفن همراه ایرانی، می‌توان از یک تابع پایتون استفاده کرد که از عبارت‌های باقاعده (Regular Expressions) برای شناسایی الگوی شماره‌های تلفن همراه