Contents

Cách tạo ứng dụng đăng ký bằng Python và cơ sở dữ liệu

Python có hỗ trợ cơ sở dữ liệu tuyệt vời được tích hợp trong thư viện tiêu chuẩn của nó, vì vậy bạn có thể tạo và tương tác với cơ sở dữ liệu mà không cần dựa vào các khung bên ngoài như Django ORM.

Sự tích hợp của Python với SQLite cung cấp một giải pháp hiệu quả để quản lý lưu trữ dữ liệu thông qua cấu trúc nhẹ của nó, giúp các nhà phát triển đang tìm cách nâng cao ứng dụng của họ có thể truy cập được. Bằng cách triển khai một ứng dụng đăng ký người dùng đơn giản, người ta có thể hiểu rõ hơn về các khái niệm cơ bản về lập trình cơ sở dữ liệu trong hệ sinh thái Python.

Cách tạo cơ sở dữ liệu bằng Python

Mã được sử dụng trong hướng dẫn này có sẵn trên kho lưu trữ GitHub mà bạn có thể truy cập để khám phá và triển khai các khái niệm được thảo luận trong tài liệu này.

Để thiết lập giao tiếp với cơ sở dữ liệu bằng Python, điều cần thiết là phải có cả đối tượng kết nối và đối tượng con trỏ. Cái trước cho phép thiết lập liên kết giữa ứng dụng và cơ sở dữ liệu, trong khi cái sau cho phép thực thi các câu lệnh SQL trong cơ sở dữ liệu.

Để thiết lập kết nối giữa ứng dụng Python của bạn và cơ sở dữ liệu hiện có hoặc tạo một kết nối mới bằng SQLite, bạn phải tuân theo các bước cụ thể. Quá trình tạo kết nối cơ sở dữ liệu bằng Python cho SQLite bao gồm một số thành phần chính như chỉ định công cụ cơ sở dữ liệu, cung cấp thông tin xác thực cần thiết, xác định tham số kết nối và cuối cùng là kết nối với phiên bản cơ sở dữ liệu mong muốn. Bằng cách tuân thủ cẩn thận các bước này, bạn có thể thiết lập thành công kết nối cơ sở dữ liệu an toàn và hiệu quả trong cơ sở mã Python bằng cách sử dụng sức mạnh của SQLite.

 import sqlite3

# Connect to a (new) database
conn = sqlite3.connect('path/to/database.db')

# Close the connection
conn.close()

Phương thức connect() chấp nhận một thư mục đại diện cho một tệp cơ sở dữ liệu hiện có. Trong trường hợp đường dẫn được chỉ định không chứa bất kỳ cơ sở dữ liệu nào, nó sẽ thiết lập một cơ sở dữ liệu. Nên giải phóng kết nối cơ sở dữ liệu sau khi hoàn thành các tương tác để quản lý tài nguyên hiệu quả.

Để tạo điều kiện thuận lợi cho việc tương tác với cơ sở dữ liệu được kết nối trong Python, cần phải sử dụng con trỏ. Việc triển khai con trỏ cho phép thực thi các truy vấn Ngôn ngữ truy vấn có cấu trúc (SQL) trong giới hạn của chương trình Python. Để thiết lập một con trỏ, hãy làm theo các bước sau:

 cursor = conn.cursor()

# Close the cursor
cursor.close()

Một đối tượng kết nối mở có thể được sử dụng để tạo ra một con trỏ bằng cách gọi phương thức cursor() của nó.

Cách thực hiện giao dịch cơ sở dữ liệu bằng Python

Việc sử dụng con trỏ cho phép người ta thực thi các câu lệnh SQL, yêu cầu hoặc chuỗi kịch bản nhằm mục đích truy xuất hoặc sửa đổi dữ liệu hoặc điều chỉnh cấu hình của lược đồ cơ sở dữ liệu.

Tồn tại ba cách tiếp cận chính mà người ta có thể sử dụng để thực hiện giao dịch cơ sở dữ liệu, đó là:

⭐ Con trỏ.execute. Phương pháp này sẽ chạy một câu lệnh SQL duy nhất. Đây là cách bạn sử dụng nó:

 cursor.execute("""
    CREATE TABLE IF NOT EXISTS users (
        name TEXT,
        age INTEGER
    )
""")

Mã này gọi phương thức thực thi trên một con trỏ, truyền cho nó một chuỗi chứa câu lệnh SQL.

⭐ Cursor.executemany. Phương pháp này cho phép bạn chạy cùng một câu lệnh SQL nhiều lần, với các tham số khác nhau mỗi lần. Phải mất hai đối số: câu lệnh SQL và một iterable. Một cách sử dụng tốt của nó là chèn nhiều đối tượng vào cơ sở dữ liệu cùng một lúc:

 data = [
    ('Alice', 25),
    ('Bob', 30),
    ('Charlie', 22)
]

cursor.executemany("""INSERT INTO users (name, age) VALUES (?, ?)""", data)

Đoạn mã trên sử dụng phương thức execmany để chèn các giá trị vào cơ sở dữ liệu nhiều lần.

Vui lòng lưu ý các phiên bản giữ chỗ có trong câu lệnh SQL đã cho. Phương thức executmany sau đó sẽ chèn dữ liệu tương ứng cho từng mục riêng lẻ.

⭐ Con trỏ.executescript. Đúng như tên gọi, phương pháp này sẽ thực thi tập lệnh SQL cho bạn. Bạn có thể viết các câu lệnh SQL của mình vào một tệp khác và chạy chúng bằng phương thức thực thi:

 with open("path/to/script.sql") as file:
 sql_script = file.read()

cursor.executescript(sql_script)

Cách xây dựng ứng dụng đăng ký bằng Python và SQLite3

Việc phát triển một ứng dụng đăng ký hiệu quả đòi hỏi phải thu thập dữ liệu của người dùng cuối bằng Python, sau đó lưu giữ chúng trong hệ thống quản lý cơ sở dữ liệu quan hệ như SQLite3. Loạt hướng dẫn này sẽ minh họa quy trình xây dựng nền tảng đăng ký thô sơ bằng Python và SQLite3.

Bước 1: Kết nối với cơ sở dữ liệu hiện có hoặc tạo cơ sở dữ liệu mới

Để bắt đầu vận hành ứng dụng của bạn, cần phải thiết lập cơ sở dữ liệu mới hoặc tích hợp với cơ sở dữ liệu hiện có.

 import sqlite3

conn = sqlite3.connect('database.db')

cursor = conn.cursor()

# your app's code goes here

cursor.close()

conn.close()

Mã này thiết lập kết nối với cơ sở dữ liệu bằng cách tạo một đối tượng kết nối, tạo điều kiện thuận lợi cho việc giao tiếp giữa ứng dụng và cơ sở dữ liệu. Ngoài ra, nó tạo ra một con trỏ cho phép truy xuất dữ liệu từ cơ sở dữ liệu một cách hiệu quả để đáp ứng các truy vấn SQL.

Bước 2: Tạo bảng cho người dùng

Để thiết lập kho lưu trữ dữ liệu cho đăng ký người dùng, cần tạo bảng bằng con trỏ chuột. Điều này có thể đạt được bằng cách sử dụng các bước sau:

 cursor.execute("""
    CREATE TABLE IF NOT EXISTS users (
        first_name TEXT,
        last_name TEXT,
        email TEXT UNIQUE,
        password TEXT
    )
""")

conn.commit()

Việc triển khai hiện tại tạo điều kiện thuận lợi cho việc tạo một bảng có tên là “người dùng” trong cơ sở dữ liệu hiện có nếu nó chưa được thiết lập. Bằng quá trình này, bốn cột riêng biệt được xây dựng để chứa dữ liệu liên quan đến người dùng cá nhân. Đặc biệt, việc cung cấp một trường “email” duy nhất đóng vai trò như một cơ chế ngăn cản người dùng thiết lập nhiều đăng ký dưới các địa chỉ thư điện tử giống hệt nhau, qua đó đảm bảo rằng mỗi tài khoản vẫn có thể nhận dạng và phân biệt duy nhất.

Thật vậy, việc thực thi conn.commit là rất quan trọng trong việc thực hiện truy vấn tới cơ sở dữ liệu, nếu không có điều này thì sẽ không có sửa đổi nào được phản ánh trong cơ sở dữ liệu.

Việc sử dụng phương thức execscript cung cấp một cách tiếp cận khác bằng cách kết hợp câu lệnh COMMIT trực tiếp trong tập lệnh SQL, do đó loại bỏ nhu cầu gọi rõ ràng conn.commit.

Bước 3: Thu thập dữ liệu người dùng

Việc kết hợp các hàm Python tạo điều kiện thuận lợi cho việc tái chế mã, giúp việc thiết lập một hàm quản lý khía cạnh đăng ký trở nên thận trọng hơn. Chức năng này sẽ tích lũy tên, họ, địa chỉ email và mật khẩu của người dùng.

 def register_user():
    first_name = input("Enter your first name: ")
    last_name = input("Enter your last name: ")
    email = input("Enter your email: ")
    password1 = input("Enter your password: ")
    password2 = input("Confirm your password: ")

Bước 4: Kiểm tra độ chính xác của mật khẩu

Chắc chắn, đây là ví dụ về cách bạn có thể sửa đổi hàm register\_user trong Python để yêu cầu người dùng nhập mật khẩu của họ hai lần và nhắc nhập lại nếu chúng không khớp:pythondef register_user(username, email, pass):# Kiểm tra nếu tên người dùng đã tồn tại_user=User.objects.filter(username=username).first()if current_user:raise ValueError(“Tên người dùng đã được sử dụng”)# Tạo người dùng mới objectuser=User.objects.create_user(tên người dùng, email, mật khẩu)# Lưu đối tượng người dùng vào cơ sở dữ liệu user.save()return f"{username}, {email}-{password}"

 def register_user():
    first_name = input("Enter your first name: ")
    last_name = input("Enter your last name: ")
    email = input("Enter your email: ")

    while True:
        password1 = input("Enter your password: ")
        password2 = input("Confirm your password: ")

        # Check password correctness
        if password1 == password2:
            print("You have successfully registered!")
            break
        else:
            print("Your passwords must match")

Để đảm bảo tính chính xác của việc tạo tài khoản, người dùng hiện được yêu cầu xác minh rằng mật khẩu được cung cấp của họ giống hệt nhau khi đăng ký. Biện pháp này giúp loại bỏ những khác biệt tiềm ẩn trong việc kết hợp tên người dùng và mật khẩu, từ đó nâng cao tính toàn vẹn của hệ thống tổng thể.

Bước 5: Kiểm tra tính duy nhất của Email

Câu lệnh SQL thiết lập bảng người dùng quy định rằng trường email phải có tính phân biệt. Do đó, trong trường hợp người dùng cố gắng đăng ký bằng cách sử dụng địa chỉ email đã được đăng ký trước đó, hệ thống quản lý cơ sở dữ liệu sẽ tạo ra một ngoại lệ. Để ứng dụng của bạn phản ứng hiệu quả và linh hoạt với tình huống này, cần triển khai các cơ chế xử lý thích hợp trong mã Python của bạn để quản lý và xử lý ngoại lệ được tạo.

 def register_user():
    first_name = input("Enter your first name: ")
    last_name = input("Enter your last name: ")

    while True:
        email = input("Enter your email: ")
        password1 = input("Enter your password: ")
        password2 = input("Confirm your password: ")

        # Check password correctness
        if password1 == password2:
            try:
                print("You have successfully created an account.")
                break
            except sqlite3.IntegrityError:
                print("Error: This email is already registered.")
        else:
            print("Your passwords must match.")

Việc triển khai hiện tại sử dụng mệnh đề thử ngoại trừ để quản lý mọi lỗi do địa chỉ email trùng lặp trong quá trình vận hành cơ sở dữ liệu. Trong trường hợp gặp phải IntegrityError trong quá trình lặp lại, luồng điều khiển sẽ được chuyển hướng trở lại yêu cầu đầu vào cho một địa chỉ email riêng biệt với người dùng.

Trong ứng dụng cụ thể này, thật hợp lý khi cho rằng bất kỳ trường hợp nào của IntegrityError xuất phát từ việc tạo tài khoản người dùng mới sẽ là do sự hiện diện của một địa chỉ email trùng lặp. Tuy nhiên, trong bối cảnh thực tế, người ta có thể sử dụng cách tiếp cận toàn diện hơn để xử lý lỗi, có thể bao gồm các vấn đề khác ngoài việc trùng lặp đơn thuần trong miền email.

Bước 6: Chèn dữ liệu người dùng vào cơ sở dữ liệu

Việc kết hợp thông tin được thu thập từ người dùng vào cơ sở dữ liệu yêu cầu thực thi câu lệnh ngôn ngữ truy vấn có cấu trúc (SQL). Để hoàn thành nhiệm vụ này, người ta có thể sử dụng truy vấn SQL trong chương trình của họ. Bằng cách điều chỉnh khối thử ngoại trừ cho phù hợp, ứng dụng có thể lưu trữ thành công thông tin chi tiết của người dùng trong cơ sở dữ liệu.

 try:
    cursor.execute("""
        INSERT INTO users (first_name, last_name, email, password)
        VALUES (?, ?, ?, ?)
    """, (first_name, last_name, email, password2))

    conn.commit()
    print("You have successfully created an account.")
    break
except sqlite3.IntegrityError:
    print("Error: This email is already registered.")

Trong câu lệnh thử ngoại trừ được cập nhật, con trỏ thực hiện hành động chèn SQL. Sau đó, phương thức conn.commit bắt đầu hoạt động SQL trên cơ sở dữ liệu.

Nếu bạn làm theo tất cả các bước trên, bạn sẽ có một ứng dụng đăng ký người dùng và lưu họ vào cơ sở dữ liệu. Bạn có thể sử dụng ứng dụng như DB Browser for SQLite để xem nội dung cơ sở dữ liệu của mình:

/vi/images/sqlite-browse-database-1.jpg

Sử dụng cơ sở dữ liệu thay vì các loại bộ sưu tập

Đối với các ứng dụng quy mô nhỏ có cấu trúc dữ liệu tương đối đơn giản, việc tạo các truy vấn SQL tùy chỉnh hoặc sử dụng thư viện Ánh xạ quan hệ đối tượng (ORM) nhẹ như SQLAlchemy có thể là một cách tiếp cận thực tế. Tuy nhiên, khi phát triển các hệ thống lớn hơn, phức tạp hơn, nơi các mối quan hệ dữ liệu ngày càng phức tạp, việc tận dụng một khuôn khổ đã được thiết lập như ORM của Django có thể mang lại những lợi thế đáng kể về hiệu quả, khả năng bảo trì và khả năng mở rộng.

Để nâng cao hơn nữa trình độ thành thạo của bạn trong các hoạt động cơ sở dữ liệu cấp thấp, hãy xem xét triển khai cơ chế đăng nhập bổ sung cho quy trình đăng ký người dùng hiện có.