Creating a database
from buzhug import Base
db = Base(path)
type can be str, unicode, int, float, bool, date, datetime, another instance of Base

cr_mode can be "override" or "open". If a base already exists in the specified path, on override mode it is replaced with the new definition, if mode is "open" this base is opened

For a thread-safe version, create an instance of TS_Base instead of Base

from buzhug import TS_Base
db = TS_Base(path)
Opening an existing database
db = Base(path).open()
Closing a database
Inserting a record in a database
by keyword : rec_id = db.insert(name1=val1[,name2=val2,...])
    rec_id is an integer that identifies the record

by list : db.insert(val1,val2,...)

as strings :

For date, datetime and unicode, first specify the string format by
Record structure
Records are Python objects with attributes of the same name as the fields

The database engine automatically adds two attributes : __id__, a unique integer for each record __version__ set to 0 when a record is first inserted, then incremented by 1 each time the record is updated ; this field is intended to be used to detect update conflicts

Selecting a record
direct access by identifier
    record = db[rec_id]

list comprehension, generator expression
   record_set = [ record for record in db if condition ]
   for record in (record for record in db if condition):
       ( anything with record...)

select() function
    result_set =,n1=v1,n2=v2...)
    result_set =,n1=[min1,max1],...)
    result_set =,predicate_str,kw_arguments)

If the records are selected for update, use select_for_update() instead of select()

Sorting the result :
results = result_set.sort_by(" + field1 - field2...")
Updating a record
db.update(record_list,name1=newval1[,name2=newval2,...]) (list of records)
Deleting records
db.delete(record)  # delete one record
db.delete(records) # delete a list of records
del db[record_id]  # delete by record id
Cleaning up the base
db.cleanup() physically removes the deleted items from disk
External references
A reference to a base can be used as a type in another base

base1 = Base('base1').create((n1,t1),(n2,t2))
base2 = Base('base2').create((n3,t3),(n4,base1))

Instances of base2 have attributes n4.n1 and n4.n2
Modifying the database structure
Adding a new field : db.add_field(field_name,field_type[,after[,default]])

Removing a field : db.drop_field(field_name)