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

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)

我正在尝试使用Python中的
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]