使用带有mysqldb和flask的游标

时间:2014-07-24 11:36:03

标签: python mysql flask

这更像是一个理论上的问题,但我一直试图找到一个正确的答案几个小时,但我还没有找到解决方案。我有一个大烧瓶应用程序,它包含多个路线。

@app.route('/try'):
@app.route('/new'):

和其他许多人。我使用MySQLdb用于数据库目的。在我开始申请之前我已经有了这个。

import MySQLdb as mysql
db = mysql.connect('localhost', 'root', 'password', 'db')
cursor = db.cursor()

它工作正常,但一段时间后,它会在分配之前生成错误“局部变量'光标'。”这可能是由于mysql关闭连接一段时间后的原因。所以,我进入了 每个路由函数中的cursor = db.cursor()并关闭它,我完成了这样的处理:

db = mysql.connect('localhost', 'root', 'password', 'db')
@app.route('/')
def home():
    cursor=db.cursor()
    ...some processing...
    cursor.close()
    return render_template('home.html')
@app.route('/new')
def home_new():
    cursor=db.cursor()
    ...some processing...
    cursor.close()
    return render_template('homenew.html')

现在我想问一下这种做法是对的吗?我应该为每个请求定义一个游标并关闭它吗?

1 个答案:

答案 0 :(得分:0)

这就是我设置MySQLdb的方法

def requestConnection():
"Create new connection. Return connection."

    convt = cv.conversions.copy()
    convt[3] = int
    convt  

    conn = db.connect(host=c.SQL_HOST, port=c.SQL_PORT, user=c.SQL_USER, passwd=c.SQL_PASSWD, db=c.SQL_DB, conv=convt, use_unicode=True, charset="utf8")
    return conn

def requestCursor(conn):
    return conn.cursor(db.cursors.DictCursor)

然后,在每个SQL函数的开头我都这样做:

def executeQuery(query):
    "Execute a given query. Used for debug purpouses."

    conn = requestConnection()
    cur = requestCursor(conn)

    cur.execute(query)

    r = cur.fetchall()

    cur.close()
    conn.close()

    return r

我更改了转换,因为我必须将DB中的int值从Float更改为int,但是您可以跳过此步骤。

如果没有,您需要导入:

import MySQLdb as db # https://github.com/farcepest/MySQLdb1
import MySQLdb.converters as cv

希望它有所帮助!