python - 如何使用 sqlite3 制作内存数据库
问题描述
我想做一个内存数据库,但我知道这两个数据库之间的区别是内存数据库,我们不应该在最后一行关闭它。我试过了,但我做不到,我无法在网上搜索找到答案。
这是数据库的完整代码:
def connect():
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute(
"""CREATE TABLE itm (id INTEGER PRIMARY KEY , namee VARCHAR , numbers INTEGER , price INTEGER )""")
conn.commit()
def insert(name, number, price):
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute(
"""INSERT INTO itm VALUES(NULL , ?, ?,?)""",(name, number, price)
)
conn.commit()
def view():
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute(
"SELECT * FROM itm"
)
rows = cur.fetchall()
return rows
def delete(id):
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("DELETE FROM itm WHERE id=?", (id,))
conn.commit()
connect()
最后,当我运行项目 python 引发此错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Green\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "D:\python\WindowsProject\app\manager\manager_sign_in.py", line 44, in back_to_main_manager
main_screen()
NameError: name 'main_screen' is not defined
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Green\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "D:\python\WindowsProject\app\manager\sign.py", line 33, in back_to_main_mngr
main_screen()
NameError: name 'main_screen' is not defined
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Green\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "D:\python\WindowsProject\app\main.py", line 33, in user_sign
user_screen()
NameError: name 'user_screen' is not defined
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Green\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "D:\python\WindowsProject\app\user\user_sign_in.py", line 188, in choose
item_memory = app.user.memory.insert(name_var.get(), numbers.get(), price,)
File "D:\python\WindowsProject\app\user\memory.py", line 15, in insert
cur.execute(
sqlite3.OperationalError: no such table: itm
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Green\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "D:\python\WindowsProject\app\user\user_sign_in.py", line 188, in choose
item_memory = app.user.memory.insert(name_var.get(), numbers.get(), price,)
File "D:\python\WindowsProject\app\user\memory.py", line 15, in insert
cur.execute(
sqlite3.OperationalError: no such table: itm
解决方案
你不能sqlite3.connect(":memory:")
在每个函数中做;他们每个人都会得到一个新的空数据库。
相反,您可以这样做,例如,conn
在您的流程中将单个动作保留为全局变量。
您也不需要明确关闭它;当您的程序退出时,它将被干净地关闭。
conn = None
def connect():
global conn
if conn:
raise RuntimeError("You can't call connect() twice")
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("""CREATE TABLE itm (id INTEGER PRIMARY KEY , namee VARCHAR , numbers INTEGER , price INTEGER )""")
conn.commit()
def insert(name, number, price):
cur = conn.cursor()
cur.execute("""INSERT INTO itm VALUES(NULL , ?, ?,?)""", (name, number, price))
conn.commit()
def view():
cur = conn.cursor()
cur.execute("SELECT * FROM itm")
rows = cur.fetchall()
return rows
def delete(id):
cur = conn.cursor()
cur.execute("DELETE FROM itm WHERE id=?", (id,))
conn.commit()
connect()
推荐阅读
- bash - 在不调用 subshell 的情况下捕获源 shell 脚本的退出代码
- postgresql - 如何在 liquibase SQL 命令中传递变量?
- c++ - 为什么变量没有重置?
- reactjs - 如何为注销添加自定义 DrawerItem
- json - 修改 Maximo 7.6.1 中生成的 JSON
- r - 如何将1个数据框中的值分配给另一个数据框中的新列
- javascript - 使用 Multer 时将 Google Cloud 映像从私有设置为公开
- jquery - 在jquery计算器中,防止用户多次点击小数点
- html - 角度路由,是重新加载整个 html 页面,还是只是页面的一部分?
- javascript - 我的代码返回此错误“错误:未知:赋值表达式中的左侧无效 (31:1)”。我该如何解决?