【发布时间】: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() 就不起作用。