【问题标题】:Python/Flask mysql cursor: Why it doesn't work?Python/Flask mysql 游标:为什么它不起作用?
【发布时间】:2017-11-24 19:12:34
【问题描述】:
from flask import Flask
from flask_mysqldb import MySQL

app = Flask(__name__)
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'todoapp'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'
mysql = MySQL(app)
cur = mysql.connection.cursor()

if __name__ == '__main__':
    app.run()

执行程序后显示错误:

cur = mysql.connection.cursor()

AttributeError: 'NoneType' 对象没有属性 'cursor'。

根据文档操作,它应该可以工作。我使用的是 Ubuntu 16.04,我已经安装了 MySQL,它可以正常工作。谁能解释为什么它不起作用?

【问题讨论】:

    标签: python mysql flask


    【解决方案1】:

    问题出在:

    app.config['MYSQL_CURSORCLASS'] = 'DictCursor'
    

    查看 flaskext.mysql 源码,该功能尚未实现。

    并且由于 flaskext.mysql 正在使用 pymysql ,您可以使用 pymysql.cursors 中的 DictCursor p>

    例子:

    from flaskext.mysql import MySQL 
    from flask import Flask 
    from pymysql import cursors
    
    app=Flask(__name__)
    
    mysql = MySQL(cursorclass=cursors.DictCursor)
    mysql.init_app(app)
    cursor = mysql.connect().cursor()
    

    【讨论】:

      【解决方案2】:
      app.config['MYSQL_HOST'] = 'localhost'
      app.config['MYSQL_DATABASE_PORT'] = 3308 #here your port
      

      【讨论】:

      • 显然默认端口是3306,但你必须把你的
      • 为了让这个答案对这个问题的读者更有用,考虑添加一个描述来解释你在做什么。
      • 请在您的答案中添加一些解释,以便其他人可以从中学习
      【解决方案3】:

      我使用了connect() 方法而不是get_db(),它适用于Python 3.5.5。我在使用 get_db 时遇到了同样的错误

      from flask import Flask
      from flaskext.mysql import MySQL
      
      
      app = Flask(__name__)
      
      
      app.config['MYSQL_DATABASE_USER'] = 'root'
      app.config['MYSQL_DATABASE_PASSWORD'] = 'root'
      app.config['MYSQL_DATABASE_DB'] = 'test_db'
      app.config['MYSQL_DATABASE_HOST'] = 'localhost'
      
      mysql = MySQL()
      mysql.init_app(app)
      
      # cursor = mysql.get_db().cursor()
      cursor = mysql.connect().cursor()
      print(cursor)
      

      【讨论】:

        【解决方案4】:

        您可能需要为 MySQL 上下文初始化应用程序。

        from flask import Flask
        from flask_mysqldb import MySQL
        
        app = Flask(__name__)
        mysql = MySQL()
        mysql.config['MYSQL_HOST'] = 'localhost'
        mysql.config['MYSQL_USER'] = 'root'
        mysql.config['MYSQL_PASSWORD'] = 'password'
        mysql.config['MYSQL_DB'] = 'todoapp'
        mysql.config['MYSQL_CURSORCLASS'] = 'DictCursor'
        mysql.init_app(app)
        cur = mysql.connection.cursor()
        
        if __name__ == '__main__':
            app.run()
        

        【讨论】:

        • 试试这个? @Raken 它可能与如何使用扩展制作对象有关
        【解决方案5】:

        您正在基于 flask_mysqldb 构建游标,并且在第一个路由被命中之前,Flask 应用程序不会自行构建,这意味着 Flask 应用程序将在 Flask 函数中构建,即您的 MySQL 连接也可以根据你的 app.config 参数构造,然后你的游标可以基于 MySQL 连接构造: Flask 构造 > MySQL 连接构造 > 游标构造。

        所以你必须在 Flask 函数中使用游标构造函数: 而不是:

        cur = mysql.connection.cursor()
        

        放:

        @app.route("/")
        def index():
           cur = mysql.connection.cursor()
        

        【讨论】:

          猜你喜欢
          • 2021-04-05
          • 1970-01-01
          • 2017-11-28
          • 1970-01-01
          • 2017-11-07
          • 2020-03-28
          • 2018-02-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多