Mysql
 sql >> база данни >  >> RDS >> Mysql

Pymysql Cursor.fetchall() / Fetchone() връща нищо

PyMySQL е библиотека на python, която може да се свърже с базата данни MySQL. Но тези дни, когато изпълнявам командата select SQL през PyMySQL, открих, че изпълнението не връща никакви записи от таблицата на базата данни, но данните наистина съществуват в таблицата на базата данни. И когато стартирам SQL командата в базата данни директно, SQL може да се изпълни успешно и данните от таблицата могат да бъдат върнати правилно. По-долу е причината, която открих в моя случай.

1. Изберете Цел на SQL командата.

Целта на SQL командата по-долу е да върне броя на съществуващите записи, чието потребителско име е 'jerry', ако броят на броя е по-голям от 0, което означава, че записът с условието съществува в таблицата на базата данни, тогава кодът няма да се вмъкне нов запис в таблицата на базата данни на MySQL. Но ако върнатият брой е 0, което означава, че данните не съществуват в таблицата, тогава можем да ги вмъкнем в таблицата на базата данни на MySQL.

"select count(id) as count from dev2qa_example.user_account where lower(user_name) = 'jerry'"

2. Как да изпълните по-горе SQL Използвайте PyMySQL.

2.1 Инсталирайте библиотеката PyMySQL.

Ако искате да изпълните горния SQL, използвайте PyMySQL, тогава първо трябва да инсталирате библиотеката PyMySQL, както е по-долу.

:~$ 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 Изпълнете SQL Използвайте PyMySQL.

Сега импортирайте PyMySQL модул свържете , курсори клас във вашия Python код и изпълнете с него горната команда select SQL. Можете да видите изходния код по-долу.

# 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()

Когато стартирате горния изходен код на python, ще получите Няма от резултата от изпълнението. Когато отстраните грешки в изходния код, можете да установите, че ако добавите cursor.fetchall() в eclipse PyDev Изрази прозорец за отстраняване на грешки преди cursor.fetchall() се извиква, можете да видите row_count value е правилната резултатна стойност (1) в Изразите колона стойност. Но когато продължите да изпълнявате cursor.fetchall() функция, върнатият резултат е празен списък.

И броят на редовете, върнат от row_count = cursor.execute(sql) кодът също не е номерът на записите, чието потребителско име е „jerry“. Това е просто броят на реда, върнат при изпълнението, ако има два или повече записа, чието потребителско име е „jerry“, row_count = cursor.execute(sql) все още е 1.

След известно разследване установих, че този проблем съществува в сценариите по-долу.

  1. Съществува само когато отстранявам грешки в горния код, когато стартирам директно горния код, резултатът е правилен.
  2. Недостатъчно разбиране на cursor.fetchall() функция, функцията ще се премести на последния ред след извикане. И резултатът ще бъде запазен в реда за временна променлива.
  3. Това е грешка в PyMySQL или MySQL, както е посочено в темата StackOverflow.

Ако сте намерили други причини, моля, добавете вашите коментари към тази статия, благодаря много.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изградим flask приложение около вече съществуваща база данни?

  2. Определете кой конфигурационен файл на MySQL се използва

  3. MySql актуализира две таблици наведнъж

  4. Изследване на MySQL Binlog сървър – Ripple

  5. Сравнение на производителността на MySQL:MySQL 5.7 срещу MySQL 8.0