Python MySQL ReferenceError: объект со слабой ссылкой больше не существует - PullRequest
1 голос
/ 25 апреля 2020

Я хочу подключиться к mySQL серверу и получить всех пользователей из таблицы пользователей. Но если я пытаюсь выполнить свой код, он говорит:

/bin/python /home/luca/PycharmProjects/Test/sql.py
Traceback (most recent call last):
  File "/home/luca/PycharmProjects/Test/sql.py", line 18, in <module>
    for x in get_user_by_username("testuser"):
  File "/usr/lib/python3.8/site-packages/mysql/connector/cursor.py", line 861, in fetchone
    row = self._fetch_row()
  File "/usr/lib/python3.8/site-packages/mysql/connector/cursor.py", line 831, in _fetch_row
    if not self._have_unread_result():
  File "/usr/lib/python3.8/site-packages/mysql/connector/cursor.py", line 351, in _have_unread_result
    return self._connection.unread_result
ReferenceError: weakly-referenced object no longer exists

Process finished with exit code 1

Вот мой код

import mysql.connector


def get_user_by_username(username):
 mydb = mysql.connector.connect(
     host="localhost",
     user="testuser",
     passwd="k3gc8pHPvEtGqND",
     database="test"
 )

 mycursor = mydb.cursor()

 mycursor.execute("SELECT * FROM users")
 return mycursor


for x in get_user_by_username("testuser"):
    print(x)

Почему это происходит и как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

cursor объект использует connection объект.
Когда ваша get_user_by_username функция завершает выполнение,
соединение с mysql закрывается, поэтому cursor также не может существовать.
Наличие функция вернет соединение и курсор будет работать.

import mysql.connector

def get_user_by_username(username):
    mydb = mysql.connector.connect(
        host="localhost",
        user=username,
        passwd="k3gc8pHPvEtGqND",
        database="test"
        )

    mycursor = mydb.cursor()

    mycursor.execute("SELECT * FROM users")
    return mydb, mycursor

mydb, mycursor = get_user_by_username("testuser")
for x in mycursor:
    print(x)
0 голосов
/ 25 апреля 2020

Это в основном происходит из-за «Слабой ссылки», подробнее об этом можно узнать на этом DO C

, ссылаясь на этот код, он будет работать как шарм:

import mysql.connector as connector

def connection():

    config = {
        "user": "dev_staq",
        "password": "dev_staq",
        "host": "localhost",
        "port": 3306,
        "database": "dev_staq"
    }
    try:
        c = connector.connect(**config)
        return c
    except:
        print "connection error"
        exit(1)


def test1(): #no error method
    cn = connection()
    cur = cn.cursor()
    cur.execute("select * from ulogin")
    print cur.fetchone()
test1()

дайте мне знать любой дальнейший запрос. Спасибо.

0 голосов
/ 25 апреля 2020

Вы можете использовать переменную, в которой есть все строки и надписью над ней

import mysql.connector


def get_user_by_username(username):
 mydb = mysql.connector.connect(
     host="localhost",
     user="testuser",
     passwd="k3gc8pHPvEtGqND",
     database="test"
 )

 mycursor = mydb.cursor()

 mycursor.execute("SELECT * FROM users") 
 records = mycursor.fetchall()
 return records

for x in get_user_by_username("testuser"):
    print(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...