SQLite3在Flask中提交之前关闭连接



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

  • 表格和字段:
  • 用户:id、姓名、密码、电子邮件、电话、地址
  • Ptype:id,value
  • 状态:id,value
  • 产品:id,name,price,ptype_id,stock
  • Cart:id,uid,status_id(status_ids引用status的id(
  • 订单: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

因此,我通过删除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!")

我真的不知道也不明白为什么会这样。如果有人知道为什么这样做有效,或者以后可能不起作用并导致问题,请务必做出回应。

最新更新