微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从sqlite3远程数据库读取

在我的服务器中,我试图从一堆sqlite3数据库(从Web客户端发送)中读取并处理它们的数据. db文件位于S3存储桶中,我有自己的URL,我可以在内存中打开它们.

现在的问题是sqlite3.connect只接受一个绝对路径字符串,我无法将内存中的文件传递给它.

conn=sqlite3.connect() #how to pass file in memory or url
c=conn.cursor()
c.execute('''select * from data;''')
res=c.fetchall()
# other processing with res

解决方法:

sqlite要求将数据库文件存储在磁盘上(它使用各种锁和分页技术).内存中的文件是不够的.

我创建一个临时目录来保存数据库文件,将其写入该目录,然后连接到它.该目录为sqlite提供了写入提交日志的空间.

要处理所有这些,上下文管理器可能会有所帮助:

import os.path
import shutil
import sqlite3
import sys
import tempfile

from contextlib import contextmanager


@contextmanager
def sqlite_database(inmemory_data):
    path = tempfile.mkdtemp()
    with open(os.path.join(path, 'sqlite.db'), 'wb') as dbfile:
        dbfile.write(inmemory_data)
    conn = None
    try:
        conn = sqlite3.connect(os.path.join(path, 'sqlite.db'))
        yield conn
    finally:
        if conn is not None:
            conn.close()
        try:
            shutil.rmtree(path)
        except IOError:
            sys.stderr.write('Failed to clean up temp dir {}'.format(path))

并将其用作:

with sqlite_database(yourdata) as connection:
    # query the database 

这会将内存数据写入磁盘,打开连接,让您使用该连接,然后在您之后清理.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐