【问题标题】:SQLite3 Closing Connection right before commiting in FlaskSQLite3 在 Flask 中提交之前关闭连接
【发布时间】:2021-04-03 20:03:00
【问题描述】:

我正在使用 Flask 构建一个 Web 应用程序。我正在使用 sqlite3 来存储信息。 SCHEMA如下:

  • 表格和字段:
  • 用户:id、姓名、密码、电子邮件、电话、地址
  • Ptype: id,value
  • 状态:id、值
  • Product:id,name,price,ptype_id,stock(ptype_id 引用 Ptype 的 id)
  • Cart:id,uid,status_id(status_id 引用 Status 的 id)
  • Order:id,uid,cart_id,o_total,date,status_id(uid引用User的id,Cart_id引用Cart的id,status_id引用Status的id)
  • Cart_item:index,cart_id,p_id,quantity,p_total(cart_id 引用 Cart 的 id,p_id 引用 Product 的 id)

我有一个表单,它接受输入“数量”并将记录插入 Cart_items 表。 插入没有给出任何异常。但是在插入之后,“g.db.commit()”给出了“无法在关闭的数据库上操作”异常。所以,我什至不能将我的更改提交到数据库。 下面给出使用的相关函数。用户是一个类。我正在使用会话来存储登录用户的详细信息。 CurrentUser() 以字典格式返回登录用户的详细信息。 CurrentCart_id() 返回当前登录用户的购物车 id。如果没有,它将向数据库中插入一个值并返回该值。

我感觉 CurrentCart_id() 无意中关闭了数据库连接。如果是这样,我该如何避免这种情况?插入值后关闭数据库不是一个好习惯吗? 如果需要代码的任何其他部分/更多解释,我将很乐意为他们提供.. 任何帮助表示赞赏!谢谢!

def connect_db():
    return sqlite3.connect('users.db')
g.db = connect_db()
g.db.execute('INSERT INTO Cart_Items(cart_id,p_id,quantity,p_total) VALUES (?,?,?,?)',[(CurrentCart_id()[0][0]),pid,int(request.form['quantity']),ptotal])
g.db.commit()
g.db.close()

def CurrentCart_id():
    g.db = connect_db()
    try:
        cursor = g.db.execute('SELECT id FROM Cart WHERE (uid=? AND status_id=1);',[CurrentUser()['id']])
        cart_id=cursor.fetchall()
        if(len(cart_id)==0):
            g.db.execute("INSERT INTO Cart (uid,status_id) VALUES(?,1);",[CurrentUser()['id']])
            cursor = g.db.execute('SELECT id FROM Cart WHERE (uid=? AND status_id=1);',[CurrentUser()['id']])
            cart_id=cursor.fetchall()
        g.db.commit()
        g.db.close()
        return cart_id
    except:
        g.db.rollback()
        g.db.close()
        return ("No User Logged in!")
def CurrentUser():
    try:
        if session['User']:
            return session['User']
    except:
        return EmptyUser()
def EmptyUser():
    return User(None,None,None,None,None,None).__dict__
class User:
    def __init__(self,id,name,password,email,phone,address):
        self.id=id
        self.name=name
        self.password=password
        self.email=email
        self.phone=phone
        self.address=address

【问题讨论】:

  • sqlite 不是多用户访问的好选择(通过使用烧瓶暗示)。如果我是你,我会将连接的生命周期与你执行的操作分开,例如,如果你运行两个查询,最好使用同一个连接。
  • 在第一个插入语句中,您是否尝试过使用双重而不是数组?在第二次插入中再次尝试使用元组......记住格式是(值,)
  • 我通过删除 CurrentCart_id() 函数中的 g.db.close() 并声明一个新变量 'arg' 来保存要传递给插入语句的参数,从而解决了这个问题。我仍然不明白为什么仅通过删除函数内部的 g.db.close() 就不起作用。

标签: python sqlite flask


【解决方案1】:

因此,我通过删除 CurrentCart_id() 中的 g.db.close() 并使用新声明的变量“args”传递参数来解决此问题,如下所示:

g.db = connect_db()
args=[int(CurrentCart_id()[0][0]),pid,int(request.form['quantity']),ptotal]
g.db.execute('INSERT INTO Cart_Items(cart_id,p_id,quantity,p_total) VALUES (?,?,?,?)',args)
g.db.commit()
g.db.close()

新的 CurrentCart_id() 看起来像:


def CurrentCart_id():
    g.db = connect_db()
    try:
        cursor = g.db.execute('SELECT id FROM Cart WHERE (uid=? AND status_id=1);',[CurrentUser()['id']])
        cart_id=cursor.fetchall()
        if(len(cart_id)==0):
            g.db.execute("INSERT INTO Cart (uid,status_id) VALUES(?,1);",[CurrentUser()['id']])
            cursor = g.db.execute('SELECT id FROM Cart WHERE (uid=? AND status_id=1);',[CurrentUser()['id']])
            cart_id=cursor.fetchall()
        g.db.commit()
        return cart_id
    except:
        g.db.rollback()
        g.db.close()
        return ("No User Logged in!")

我真的不知道也不明白为什么会这样。如果有人知道为什么这会起作用,或者这可能不起作用并在以后引起问题,请回复。

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多