Thứ Bảy, 25 tháng 5, 2024

48. Chương trình tào lao Python MySQL phần 2

Chúng ta đã tạo một database tên là mydatabase trong phần trước. Phần này chúng ta sẽ tạo bảng trong cơ sở dữ liệu mydatabase

Trước hết chúng ta cần coi lại code của phần trước.

 

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="password của bạn"
)

mycursor = mydb.cursor()
# Kiem tra database co ton tai hay khong
mycursor.execute("SHOW DATABASES")
databases = mycursor.fetchall()

database_exists = False
for database in databases:
  if 'mydatabase' in database:
    database_exists = True
    break

if database_exists:
  print("Database Ton Tai")
else:
  print("Database Khong Ton Tai")
  mycursor.execute("CREATE DATABASE mydatabase")

mydb.close()

 

Trong code, "mysql.connector" là một module, được nhập vào đầu chương trình bằng lệnh import. Sau đó, hàm connect() được gọi để tạo kết nối đến máy chủ MySQL mà chúng ta đã cài đặt. Host mặc định là localhost và User mặc định là root. Bạn sẽ cần thay thế 'password của bạn' mật khẩu MySQL của bạn.

Tiếp theo, một đối tượng con trỏ được tạo bằng phương thức cursor() của đối tượng kết nối mydb. Đối tượng con trỏ này có thể được sử dụng để thực thi các câu lệnh SQL trên cơ sở dữ liệu.

Tiếp theo, chương trình thực thi câu lệnh SHOW DATABASES để lấy danh sách tất cả các cơ sở dữ liệu trên máy chủ MySQL. Sau đó, phương thức fetchall() được gọi để thu thập tất cả kết quả của truy vấn dưới dạng danh sách Tuple.

Sau đó, chương trình sẽ dùng vòng lặp For, lặp qua danh sách cơ sở dữ liệu và kiểm tra xem cơ sở dữ liệu "mydatabase" có tồn tại hay không. Nếu cơ sở dữ liệu tồn tại, chương trình sẽ đặt biến database_exists thành 'True'. Nếu không, biến được đặt thành 'False'.

Chúng ta nên đóng kết nối sau khi chương trình thực hiện

mydb.close()


Ngoài ra, chúng ta cũng nên đóng cursor khi không còn sử dụng.

mycursor.close()


Quay lại với chương trình...tào lao của chúng ta. Bây giờ ta sẽ cùng nhau tạo một bảng trong mydatabase.

Chúng ta sẽ tạo một bảng SinhVien tương tự phần trước

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="password của bạn" ,
  database="mydatabase"
)

mycursor = mydb.cursor()
# Kiem tra database co ton tai hay khong
mycursor.execute("SHOW DATABASES")
databases = mycursor.fetchall()

database_exists = False
for database in databases:
  if 'mydatabase' in database:
    database_exists = True
    break

if database_exists:
  print("Database Ton Tai")
else:
  print("Database Khong Ton Tai")
  mycursor.execute("CREATE DATABASE mydatabase")


mycursor.execute("CREATE TABLE SinhVien (id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, name VARCHAR(255), class VARCHAR(100))")

mycursor.close()
mydb.close()


Chúng ta đã thêm lệnh database="mydatabase" và một lệnh tạo bảng SinhVien. Bấm Run chạy chương trinh, chúng ta đã thành công tạo bảng SinhVien trong cơ sở dữ liệu mydatabase


Chương trình tào lao Python MySQL phần 2


Tuy nhiên, cũng như với lệnh tạo database, nếu chúng ta "táy máy" bấm Run thêm lần nữa, chương trình sẽ báo lỗi.



Chúng ta có câu lệnh tương tự như lệnh lấy danh sách CSDL ở phần trước.

mycursor.execute("SHOW TABLES")



Lệnh trên sẽ lấy danh sách các bảng trong cơ sở dữ liệu. Vậy thì dễ rồi, cứ như cũ mà "mần thôi". Đây là code, tạm thời chúng ta chưa thực hiện lệnh tạo bảng (Sử dụng dấu #)

 

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="password của bạn" ,
  database="mydatabase"
)

mycursor = mydb.cursor()
# Kiem tra database co ton tai hay khong
mycursor.execute("SHOW DATABASES")
databases = mycursor.fetchall()

database_exists = False
for database in databases:
  if 'mydatabase' in database:
    database_exists = True
    break

if database_exists:
  print("Database Ton Tai")
else:
  print("Database Khong Ton Tai")
  mycursor.execute("CREATE DATABASE mydatabase")

# Kiem tra table co ton tai hay khong
mycursor.execute("SHOW TABLES")
tables = mycursor.fetchall()

table_exists = False
for table in tables:
  if 'sinhvien' in tables:
    table_exists = True
    break

if table_exists:
  print("Table Ton Tai")
else:
  print("Table Khong Ton Tai")
  #mycursor.execute("CREATE TABLE SinhVien (id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, name VARCHAR(255), class VARCHAR(100))")


mycursor.close()
mydb.close()


Vẫn sử dụng PyCharm, chạy chương trình. Mọi thứ ổn, nhưng...hình như có gì đó sai sai...??



 

Rõ ràng Table SinhVien có tồn tại trong database, nhưng tại sao chương trình lại nói không tồn tại?

Chúng ta cần dò ra lỗi, chúng ta thử thêm một lệnh print để coi "đường đi nước bước" của chương trình. Ta thêm mấy dấu !! vào để dễ nhận ra vị trí


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="password của bạn" ,
  database="mydatabase"
)

mycursor = mydb.cursor()
# Kiem tra database co ton tai hay khong
mycursor.execute("SHOW DATABASES")
databases = mycursor.fetchall()

database_exists = False
for database in databases:
  if 'mydatabase' in database:
    database_exists = True
    break

if database_exists:
  print("Database Ton Tai")
else:
  print("Database Khong Ton Tai")
  mycursor.execute("CREATE DATABASE mydatabase")

# Kiem tra table co ton tai hay khong
mycursor.execute("SHOW TABLES")
tables = mycursor.fetchall()

table_exists = False
for table in tables:
  if 'sinhvien' in tables:
    print("Table Khong Ton Tai!!!!!")
    table_exists = True
    break

if table_exists:
  print("Table Ton Tai")
else:
  print("Table Khong Ton Tai")
  #mycursor.execute("CREATE TABLE SinhVien (id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, name VARCHAR(255), class VARCHAR(100))")



mycursor.close()
mydb.close()


Bấm Run để chạy chương trình

 




Rõ ràng câu lệnh if 'sinhvien' in tables: là FALSE nên chương trình không thực hiện lệnh print("Table Khong Ton Tai!!!!!").

Khi chúng ta thử thực hiện lệnh một lệnh print table như sau


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="password của bạn" ,
  database="mydatabase"
)

mycursor = mydb.cursor()
# Kiem tra database co ton tai hay khong
mycursor.execute("SHOW DATABASES")
databases = mycursor.fetchall()

database_exists = False
for database in databases:
  if 'mydatabase' in database:
    database_exists = True
    break

if database_exists:
  print("Database Ton Tai")
else:
  print("Database Khong Ton Tai")
  mycursor.execute("CREATE DATABASE mydatabase")

# Kiem tra table co ton tai hay khong
mycursor.execute("SHOW TABLES")
for x in mycursor:
  print(x)

tables = mycursor.fetchall()

table_exists = False
for table in tables:
  if 'sinhvien' in tables:
    print("Table Khong Ton Tai!!!!!")
    table_exists = True
    break

if table_exists:
  print("Table Ton Tai")
else:
  print("Table Khong Ton Tai")
  #mycursor.execute("CREATE TABLE SinhVien (id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, name VARCHAR(255), class VARCHAR(100))")


mycursor.close()
mydb.close()


Bấm Run để chạy chương trình


Chúng ta nghĩ rằng sau khi "SHOW TABLES" kết quả trả về sẽ là 'sinhvien', nhưng khi in ra chúng ta lại thấy ('sinhvien',), có thể nguyên nhân từ đây mà ra. Chúng ta sẽ sửa lại code

 

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="password của bạn" ,
  database="mydatabase"
)

mycursor = mydb.cursor()
# Kiem tra database co ton tai hay khong
mycursor.execute("SHOW DATABASES")
databases = mycursor.fetchall()

database_exists = False
for database in databases:
  if 'mydatabase' in database:
    database_exists = True
    break

if database_exists:
  print("Database Ton Tai")
else:
  print("Database Khong Ton Tai")
  mycursor.execute("CREATE DATABASE mydatabase")

# Kiem tra table co ton tai hay khong
mycursor.execute("SHOW TABLES")
tables = mycursor.fetchall()

table_exists = False
for (table,) in tables:
  if ('sinhvien',) in tables:

    print("Table Ton Tai!!")
    table_exists = True
    break

if table_exists:
  print("Table Ton Tai")
else:
  print("Table Khong Ton Tai")
  #mycursor.execute("CREATE TABLE SinhVien (id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, name VARCHAR(255), class VARCHAR(100))")



mycursor.close()
mydb.close()


Bấm Run để chạy chương trình, bây giờ thì mọi thứ đã như mong muốn của chúng ta



Việc cuối cùng chúng ta chỉ cần "mở khóa" cho lệnh tạo bảng, đây là code


import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="password của bạn" ,
  database="mydatabase"
)

mycursor = mydb.cursor()
# Kiem tra database co ton tai hay khong
mycursor.execute("SHOW DATABASES")
databases = mycursor.fetchall()

database_exists = False
for database in databases:
  if 'mydatabase' in database:
    database_exists = True
    break

if database_exists:
  print("Database Ton Tai")
else:
  print("Database Khong Ton Tai")
  mycursor.execute("CREATE DATABASE mydatabase")

# Kiem tra table co ton tai hay khong
mycursor.execute("SHOW TABLES")
tables = mycursor.fetchall()

table_exists = False
for (table,) in tables:
  if ('sinhvien',) in tables:
    print("Table Ton Tai!!")
    table_exists = True
    break

if table_exists:
  print("Table Ton Tai")
else:
  print("Table Khong Ton Tai")
  mycursor.execute("CREATE TABLE SinhVien (id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, name VARCHAR(255), class VARCHAR(100))")



mycursor.close()
mydb.close()

 

Bấm Run để chạy, mọi thứ đã đâu vào đấy!




Phần tiếp theo


Phần trước


Không có nhận xét nào:

Đăng nhận xét