Reputation: 253
I have code:
from io import BytesIO as Memory
import requests
def download_file_to_obj(url, file_obj):
with requests.get(url, stream=True) as r:
r.raise_for_status()
for chunk in r.iter_content(chunk_size=None):
if chunk:
file_obj.write(chunk)
def main(source_url):
db_in_mem = Memory()
print('Downloading..')
download_file_to_obj(source_url, db_in_mem)
print('Complete!')
with sqlite3.connect(database=db_in_mem.read()) as con:
cursor = con.cursor()
cursor.execute('SELECT * FROM my_table limit 10;')
data = cursor.fetchall()
print(data)
del(db_in_mem)
The my_table exits in source database. Error:
sqlite3.OperationalError: no such table: my_table
How to load sqlite database to memory from http?
Upvotes: 4
Views: 1848
Reputation: 106
The most common way to force an SQLite database to exist purely in memory is to open the database using the special filename :memory:
. In other words, instead of passing the name of a real disk file pass in the string :memory:
. For example:
database = sqlite3.connect(":memory:")
When this is done, no disk file is opened. Instead, a new database is created purely in memory. The database ceases to exist as soon as the database connection is closed. Every :memory: database is distinct from every other. So, opening two database connections each with the filename ":memory:" will create two independent in-memory databases.
Note that in order for the special :memory:
name to apply and to create a pure in-memory database, there must be no additional text in the filename. Thus, a disk-based database can be created in a file by prepending a pathname, like this: ./:memory:
.
See more here: https://www.sqlite.org/inmemorydb.html
Upvotes: 3
Reputation: 2342
You can build on top of this solution and insert the data into an in-memory SQLite database, created with db = sqlite3.connect(":memory:")
. You should be able to perform queries from that database.
Upvotes: 0