PyMySQL là một thư viện python có thể kết nối với cơ sở dữ liệu MySQL. Nhưng những ngày này khi tôi thực hiện lệnh SQL select thông qua PyMySQL, tôi thấy việc thực thi không trả về bất kỳ bản ghi nào từ bảng cơ sở dữ liệu, nhưng dữ liệu thực sự tồn tại trong bảng cơ sở dữ liệu. Và khi tôi chạy trực tiếp lệnh SQL trong cơ sở dữ liệu, SQL có thể thực thi thành công và dữ liệu bảng có thể được trả về một cách chính xác. Dưới đây là lý do tôi tìm thấy trong trường hợp của mình.
1. Chọn Mục đích Lệnh SQL.
Mục tiêu của lệnh SQL dưới đây là trả về số lượng bản ghi tồn tại có user_name là 'jerry', nếu số đếm lớn hơn 0 có nghĩa là bản ghi có điều kiện tồn tại trong bảng cơ sở dữ liệu, thì mã sẽ không chèn một bản ghi mới vào bảng cơ sở dữ liệu MySQL. Nhưng nếu số đếm được trả về là 0 có nghĩa là dữ liệu không tồn tại trong bảng, thì chúng ta có thể chèn nó vào bảng cơ sở dữ liệu MySQL.
"select count(id) as count from dev2qa_example.user_account where lower(user_name) = 'jerry'"
2. Cách thực thi SQL trên Sử dụng PyMySQL.
2.1 Cài đặt Thư viện PyMySQL.
Nếu bạn muốn thực thi SQL ở trên bằng cách sử dụng PyMySQL, thì trước tiên bạn cần cài đặt thư viện PyMySQL như bên dưới.
:~$ pip3 install PyMySQL Collecting PyMySQL Downloading https://files.pythonhosted.org/packages/ed/39/15045ae46f2a123019aa968dfcba0396c161c20f855f11dea6796bcaae95/PyMySQL-0.9.3-py2.py3-none-any.whl (47kB) 100% |████████████████████████████████| 51kB 152kB/s Installing collected packages: PyMySQL Successfully installed PyMySQL-0.9.3 [email protected]:~$ pip3 show PyMySQL Name: PyMySQL Version: 0.9.3 Summary: Pure Python MySQL Driver Home-page: https://github.com/PyMySQL/PyMySQL/ Author: yutaka.matsubara Author-email: [email protected] License: "MIT" Location: /home/zhaosong/.local/lib/python3.6/site-packages Requires:
2.2 Chạy SQL Sử dụng PyMySQL.
Bây giờ nhập mô-đun PyMySQL kết nối , con trỏ lớp vào mã Python của bạn và thực hiện lệnh SQL select ở trên với nó. Bạn có thể xem mã nguồn bên dưới.
# import pymysql connect and cursors class. from pymysql import connect, cursors # get mysql connection object. conn = connect(host='127.0.0.1', user='root', password='root', db='dev2qa_example', charset='utf8', cursorclass=cursors.DictCursor) try: # get database cursor object. with conn.cursor() as cursor: # execute select sql command. row_count = cursor.execute(sql) print('select return row count = ' + str(row_count)) # get the execution result and print it out. row = cursor.fetchall() print(row) finally: # do not forget close mysql connection at the end of the code. conn.close()
Khi bạn chạy mã nguồn python ở trên, bạn sẽ nhận được Không có từ kết quả thực hiện. Khi bạn gỡ lỗi mã nguồn, bạn có thể thấy rằng nếu bạn thêm cursor.fetchall()
trong Biểu thức PyDev nhật thực cửa sổ gỡ lỗi trước cursor.fetchall()
được gọi, bạn có thể thấy row_count giá trị là giá trị kết quả chính xác (1) trong Biểu thức cột giá trị. Nhưng khi bạn tiếp tục chạy cursor.fetchall()
, kết quả trả về là một danh sách trống.
Và số hàng được trả về bởi row_count = cursor.execute(sql)
mã cũng không phải là số đếm bản ghi có user_name là ‘jerry’. Nó chỉ là số hàng được trả về khi thực thi, nếu có hai hoặc nhiều bản ghi có user_name là ‘jerry’ thì row_count = cursor.execute(sql)
vẫn là 1.
Sau một số cuộc điều tra, tôi nhận thấy vấn đề này tồn tại trong các trường hợp bên dưới.
- Chỉ tồn tại khi tôi gỡ lỗi mã trên, khi tôi chạy trực tiếp đoạn mã trên, kết quả là chính xác.
- Chưa hiểu về
cursor.fetchall()
hàm, hàm sẽ di chuyển đến hàng cuối cùng sau khi được gọi. Và kết quả sẽ được lưu vào hàng biến tạm thời. - Đây là một lỗi của PyMySQL hoặc MySQL, như chủ đề StackOverflow đã đề cập.
Nếu bạn tìm thấy bất kỳ lý do nào khác, vui lòng thêm ý kiến của bạn vào bài viết này, cảm ơn rất nhiều.