如何使用sqlite创建内存数据库?

时间:2016-07-30 17:35:00

标签: python python-2.7 sqlite

我试图在Python中使用sqlite3创建内存数据库。

我创建了一个函数来创建一个db数据库文件并将信息存储到它中,并且该工作100%正常工作。

但是尝试与:memory:联系我遇到了一些问题。

我正在做的是:

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
  1. 创建名称表

    execute_db("create table name(name text)")
    

    返回True

  2. 在此表中插入一些信息

    execute_db("insert into name values('Hello')")
    

    返回

    no such table: name
    False
    
  3. 为什么这不起作用?它在我使用文件时有效:

    db = sqlite3.connect("sqlite3.db")
    

2 个答案:

答案 0 :(得分:10)

每次调用该函数时,都会创建一个 new 连接。每次连接调用都会生成 new 内存数据库。

在函数外部创建连接,并将其传递给函数,或创建shared memory connection

db = sqlite3.connect("file::memory:?cache=shared")

但是,当从内存中删除最后一个连接时,数据库将被擦除;在你的情况下,每次功能结束时都会这样。

只需使用数据库连接as a context manager

,而不是显式调用db.commit()
try:
    with db:
        cur = db.cursor()
        # massage `args` as needed
        cur.execute(*args)
        return True
except Exception as why:
    return False

如果没有异常,则自动提交事务,否则回滚。请注意,提交仅读取数据的查询是安全的。

答案 1 :(得分:0)

我创建了一个数据框,并将其转储到具有共享缓存的内存数据库中:

#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)。如果我腌制相同的数据框并打开它,则读取仅需0.3秒:发现这一点非常令人失望,因为我希望将一个巨大的表转储到内存中并将其立即拉到我想要的任何位置。但是你去了,泡菜。