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

Deo*_*nix 12 python sqlite python-2.7

我正在尝试使用sqlite3Python 创建内存数据库.

我创建了一个函数来创建一个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
Run Code Online (Sandbox Code Playgroud)
  1. 创建名称表

    execute_db("create table name(name text)")
    
    Run Code Online (Sandbox Code Playgroud)

    哪个回来了 True

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

    execute_db("insert into name values('Hello')")
    
    Run Code Online (Sandbox Code Playgroud)

    哪个回来了

    no such table: name
    False
    
    Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?它在我使用文件时有效:

db = sqlite3.connect("sqlite3.db")
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 12

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

在函数外部创建连接,并将其传递给函数,或创建共享内存连接:

db = sqlite3.connect("file::memory:?cache=shared")
Run Code Online (Sandbox Code Playgroud)

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

而不是显式调用db.commit(),只需使用数据库连接作为上下文管理器:

try:
    with db:
        cur = db.cursor()
        # massage `args` as needed
        cur.execute(*args)
        return True
except Exception as why:
    return False
Run Code Online (Sandbox Code Playgroud)

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

  • 但如果我创建共享内存连接,该连接是否与内存连接一样快? (2认同)

ajs*_*jsp 6

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

#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")
Run Code Online (Sandbox Code Playgroud)

在另一个线程/脚本中从内存数据库读取:

#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]
Run Code Online (Sandbox Code Playgroud)

请注意,这是从内存中读取 135 万行的时间为 15 秒的操作 (python 2.7)。如果我pickle相同的数据帧并打开它,读取只需要0.3秒:这是非常令人失望的发现,因为我希望将一个巨大的表转储到内存中并立即将其拉到我想要的任何地方。但你看,腌菜就是这样。