Python in-memory ORM database
Project description
littletable - a Python module to give ORM-like access to a collection of objects
The littletable
module provides a low-overhead, schema-less, in-memory database access to a collection
of user objects. littletable
provides a DataObject
class for ad hoc creation of semi-immutable objects
that can be stored in a littletable
Table
. Tables can also contain user-defined objects, using those
objects' __dict__
, __slots__
, or _fields
mappings to access object attributes.
In addition to basic ORM-style insert/remove/query/delete access to the contents of a Table
, littletable
offers:
- simple indexing for improved retrieval performance, and optional enforcing key uniqueness
- access to objects using indexed attributes
- simplified joins using
"+"
operator syntax between annotatedTable
s - the result of any query or join is a new first-class
littletable
Table
- access like a standard Python list to the records in a Table, including
indexing/slicing,
iter
,zip
,len
,groupby
, etc. - access like a standard Python
dict
to attributes with a unique index, or like a standard Pythondefaultdict(list)
to attributes with a non-unique index.
littletable
Table
s do not require an upfront schema definition, but simply work off of the attributes in
the stored values, and those referenced in any query parameters.
Importing data from CSV files:
You can easily import a CSV file into a Table using Table.csv_import():
t = Table().csv_import("my_data.csv")
In place of a local file name, you can also specify an HTTP url:
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/iris.csv"
iris_table = Table('iris').csv_import(url)
You can also directly import CSV data as a string:
catalog = Table("catalog")
catalog_data = """\
sku,description,unitofmeas,unitprice
BRDSD-001,Bird seed,LB,3
BBS-001,Steel BB's,LB,5
MGNT-001,Magnet,EA,8"""
catalog.csv_import(catalog_data, transforms={'unitprice': int})
Files containing JSON-formatted records can be similarly imported using Table.json_import()
.
Tabular output
To produce a nice tabular output for a table, you can use the embedded support for
the rich module, as_html()
in Jupyter Notebook,
or the tabulate module:
Using table.present()
(implemented using rich
; present()
accepts rich
Table
keyword args):
table(title_str).present(fields=["col1", "col2", "col3"])
or
table.select("col1 col2 col3")(title_str).present(caption="caption text",
caption_justify="right")
Using Jupyter Notebook
:
from IPython.display import HTML, display
display(HTML(table.as_html()))
Using tabulate
:
from tabulate import tabulate
print(tabulate(map(vars, table), headers="keys"))
Sample Demo
Here is a simple littletable data storage/retrieval example:
from littletable import Table, DataObject
customers = Table('customers')
customers.create_index("id", unique=True)
customers.insert(DataObject(id="0010", name="George Jetson"))
customers.insert(DataObject(id="0020", name="Wile E. Coyote"))
customers.insert(DataObject(id="0030", name="Jonny Quest"))
catalog = Table('catalog')
catalog.create_index("sku", unique=True)
catalog.insert(DataObject(sku="ANVIL-001", descr="1000lb anvil", unitofmeas="EA",unitprice=100))
catalog.insert(DataObject(sku="BRDSD-001", descr="Bird seed", unitofmeas="LB",unitprice=3))
catalog.insert(DataObject(sku="MAGNT-001", descr="Magnet", unitofmeas="EA",unitprice=8))
catalog.insert(DataObject(sku="MAGLS-001", descr="Magnifying glass", unitofmeas="EA",unitprice=12))
wishitems = Table('wishitems')
wishitems.create_index("custid")
wishitems.create_index("sku")
# easy to import CSV data from a string or file
wishitems.csv_import("""\
custid,sku
0020,ANVIL-001
0020,BRDSD-001
0020,MAGNT-001
0030,MAGNT-001
0030,MAGLS-001
""")
# print a particular customer name
# (unique indexes will return a single item; non-unique
# indexes will return a list of all matching items)
print(customers.by.id["0030"].name)
# see all customer names
for name in customers.all.name:
print(name)
# print all items sold by the pound
for item in catalog.where(unitofmeas="LB"):
print(item.sku, item.descr)
# print all items that cost more than 10
for item in catalog.where(lambda o: o.unitprice > 10):
print(item.sku, item.descr, item.unitprice)
# join tables to create queryable wishlists collection
wishlists = customers.join_on("id") + wishitems.join_on("custid") + catalog.join_on("sku")
# print all wishlist items with price > 10 (can use Table.gt comparator instead of lambda)
bigticketitems = wishlists().where(unitprice=Table.gt(10))
for item in bigticketitems:
print(item)
# list all wishlist items in descending order by price
for item in wishlists().sort("unitprice desc"):
print(item)
# print output as a nicely-formatted table
wishlists().sort("unitprice desc")("Wishlists").present()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for littletable-1.1.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 682b08103b2ce0a18a06a19b82ea377a4c0a16ad6011e235c21e6e4abe050278 |
|
MD5 | 2969c61ea9e5099415eac20fd8043157 |
|
BLAKE2b-256 | decae2adde1d35ae579b00bacb647f2b6f0f8aa80c9e1e7dab49700fef794396 |