Python 如何使用sqlite创建内存中的数据库?
我正在尝试使用Python中的Python 如何使用sqlite创建内存中的数据库?,python,python-2.7,sqlite,Python,Python 2.7,Sqlite,我正在尝试使用Python中的sqlite3创建内存中的数据库 我创建了一个函数来创建一个db数据库文件并将信息存储到其中,这是100%有效的 但是尝试连接:内存:我遇到了一些问题 我正在做的是: import sqlite3 def execute_db(*args): db = sqlite3.connect(":memory:") cur = db.cursor() data = True try: args = list(args)
sqlite3
创建内存中的数据库
我创建了一个函数来创建一个db数据库文件并将信息存储到其中,这是100%有效的
但是尝试连接:内存:
我遇到了一些问题
我正在做的是:
import sqlite3
def execute_db(*args):
db = sqlite3.connect(":memory:")
cur = db.cursor()
data = True
try:
args = list(args)
args[0] = args[0].replace("%s", "?").replace(" update "," `update` ")
args = tuple(args)
cur.execute(*args)
arg = args[0].split()[0].lower()
if arg in ["update", "insert", "delete", "create"]: db.commit()
except Exception as why:
print why
data = False
db.rollback()
db.commit()
db.close()
return data
execute_db("create table name(name text)")
返回的True
execute_db("insert into name values('Hello')")
返回的
no such table: name
False
db = sqlite3.connect("sqlite3.db")
每次调用函数时,都会创建一个新的连接。每个连接调用都会生成一个新的内存数据库 在函数外部创建连接,并将其传递到函数中,或创建: 但是,当最后一个连接从内存中删除时,数据库将被擦除;在您的情况下,每次函数结束时都会出现这种情况 不要显式调用
db.commit()
,只需使用数据库连接即可:
如果没有异常,事务将自动提交,否则将回滚。请注意,提交仅读取数据的查询是安全的。我创建了一个数据帧,并将其转储到具有共享缓存的内存数据库中:
#sql_write.py
import sqlite3
import pandas as pd
conn = sqlite3.connect('file:cachedb?mode=memory&cache=shared')
cur = conn.cursor()
df
DT Bid Ask
0 2020-01-06 00:00:00.103000 1.11603 1.11605
1 2020-01-06 00:00:00.204000 1.11602 1.11605
... ... ... ...
13582616 2020-06-01 23:59:56.990000 1.11252 1.11256
13582617 2020-06-01 23:59:58.195000 1.11251 1.11255
[13582618 rows x 3 columns]
df.to_sql("ticks", conn, if_exists="replace")
从另一个线程/脚本中的内存数据库读取:
#sql_read.py
import sqlite3
import pandas as pd
conn = sqlite3.connect('file:cachedb?mode=memory&cache=shared')
cur = conn.cursor()
df = pd.read_sql_query("select * from ticks", conn)
df
DT Bid Ask
0 2020-01-06 00:00:00.103000 1.11603 1.11605
1 2020-01-06 00:00:00.204000 1.11602 1.11605
... ... ... ...
13582616 2020-06-01 23:59:56.990000 1.11252 1.11256
13582617 2020-06-01 23:59:58.195000 1.11251 1.11255
[13582618 rows x 3 columns]
请注意,这是一个15秒的内存读取,在135万行上(python 2.7)。如果我对同一个数据帧进行pickle并打开它,读取只需0.3秒:发现这一点非常令人失望,因为我希望将一个巨大的表转储到内存中,并立即将其拉到我想要的任何位置。但是你看,pickle就是了。为什么在更改数据时要使用双
db.commit()
。@MartijnPieters-Ohh,我的错,谢谢你。但是如果我创建共享内存连接,这个连接和内存连接一样快吗?
#sql_write.py
import sqlite3
import pandas as pd
conn = sqlite3.connect('file:cachedb?mode=memory&cache=shared')
cur = conn.cursor()
df
DT Bid Ask
0 2020-01-06 00:00:00.103000 1.11603 1.11605
1 2020-01-06 00:00:00.204000 1.11602 1.11605
... ... ... ...
13582616 2020-06-01 23:59:56.990000 1.11252 1.11256
13582617 2020-06-01 23:59:58.195000 1.11251 1.11255
[13582618 rows x 3 columns]
df.to_sql("ticks", conn, if_exists="replace")
#sql_read.py
import sqlite3
import pandas as pd
conn = sqlite3.connect('file:cachedb?mode=memory&cache=shared')
cur = conn.cursor()
df = pd.read_sql_query("select * from ticks", conn)
df
DT Bid Ask
0 2020-01-06 00:00:00.103000 1.11603 1.11605
1 2020-01-06 00:00:00.204000 1.11602 1.11605
... ... ... ...
13582616 2020-06-01 23:59:56.990000 1.11252 1.11256
13582617 2020-06-01 23:59:58.195000 1.11251 1.11255
[13582618 rows x 3 columns]