【问题标题】:Python MySQL ReferenceError: weakly-referenced object no longer existsPython MySQL ReferenceError:弱引用对象不再存在
【发布时间】:2020-04-25 16:41:41
【问题描述】:

我想连接到 mySQL Server 并从 users 表中获取所有用户。但是如果我尝试执行我的代码,它会说:

/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)

为什么会发生这种情况,我该如何解决?

【问题讨论】:

    标签: python mysql python-3.x


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案2】:

      你可以使用一个包含所有行的变量,并且在它上面有循环

      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)
      

      【讨论】:

        【解决方案3】:

        这基本上是因为“弱参考”而发生的,请在this DOC阅读更多相关信息

        参考这段代码,它会像魅力一样工作:

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

        如有任何疑问,请告诉我。谢谢。

        【讨论】:

        【解决方案4】:

        我猜你可以像这样使用自己的连接器类

        # do some imports
        from mysql import connector
        
        # Add connection and cursor wrapper
        class MySQLConnector:
            conn=None
            cursor=None
                
            def __init__(self):
                self.conn=connector.connect(
                    host="host",
                    port="port",
                    user="user",
                    password="pass",
                    database="database"
                )
                self.cursor=self.conn.cursor()
        
        # Connect
        myconn=MySQLConnector()
        
        # Select from database
        def getMyRows():
            myconn.cursor.execute("SELECT * FROM your_table WHERE something")
            row = myconn.cursor.fetchone()
            print(row)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-01
          • 1970-01-01
          • 2023-04-04
          • 2018-08-28
          • 2020-07-19
          • 2010-12-01
          • 2020-12-01
          • 2020-08-22
          相关资源
          最近更新 更多