Immutable NoSQL database in a plain file
Go to file
Andros Fenollosa ebf9b5bcb6 Update returns
2022-12-05 15:15:45 +01:00
.github Add requirements 2022-11-09 16:54:29 +01:00
assets Add logo 2022-11-09 11:57:45 +01:00
test Update updates 2022-12-05 14:52:09 +01:00
.gitignore Add test update 2022-12-05 14:02:22 +01:00
fiable_db.py Update returns 2022-12-05 15:15:45 +01:00
LICENCE Create LICENCE 2022-11-09 12:18:58 +01:00
Makefile Format 2022-11-09 16:59:42 +01:00
README.md Fix table add 2022-11-30 11:05:31 +01:00
requirements.txt Add requirements 2022-11-09 16:54:29 +01:00
setup.py Format 2022-11-09 16:59:42 +01:00
todo.org Add test update 2022-12-05 14:02:22 +01:00

fiableDB logo

Features

  • Information is never lost. Even if you make updates or deletions, you will be able to recover any information at any time.
  • There are no restrictions on the data structure or columns, since dictionaries are used without limitations on nesting. Similar to MongoDB Documents.
  • All the information is stored in a JSON file.
  • Extremely fast since it has no queue or locking limitations.
  • Minimalistic to implement and use.

Why use fiableDB instead of other relational databases?

  • High level of consistency and accuracy of data, such as a hospital patient's chronology or banking data. It cannot be modified once it has been aggregated.
  • They simplify the process of backing up and restoring data, because you can always revert to the original version of the data if necessary.
  • Very secure, modifying existing data will be detected and rejected.

Install

Python version: >=3.8

pip3 install --user fiable_db

Docs

All documentation can be read as a sequential tutorial.

Step1: Start

To load the database you must import fiable_db and start it.

import fiable_db

fiable_db.start()

It will create a file named fiable_db.json in the current directory. If you want to change the name of the file, you can do it by passing the name as a parameter.

fiable_db.start(file="my_db.json")

If the file already exists, it will be loaded. Nothing is deleted here!

Step 2: Agregation

Only one:

fiable_db.add({"name": "Miguel", "age": 41, "height": 189})
# {"id": 1, "rev": 1, "table": "default", "data": {"name": "Miguel", "age": 41, "height": 189}}

Various:

fiable_db.add(
    [
        {"name": "Noelia", "age": 34, "height": 165},
        {"name": "Juan", "age": 41, "height": 187},
        {"name": "Valentina", "age": 12, "height": 142},
    ]
)
# [
#     {"id": 2, "rev": 1, "table": "default", "data": {"name": "Noelia", "age": 34, "height": 165}},
#     {"id": 3, "rev": 1, "table": "default", "data": {"name": "Juan", "age": 41, "height": 187}},
#     {"id": 4, "rev": 1, "table": "default", "data": {"name": "Valentina", "age": 12, "height": 142}},
# ]

Step 3: Update

Update a key:

fiable_db.update(4, {"age": 21})
# {"id": 4, "rev": 2, "table": "default", "data": {"name": "Valentina", "age": 21, "height": 172}}

If the key does not exist, it will be added:

fiable_db.update(4, {"is_active": True})
# {"id": 4, "rev": 3, "table": "default", "data": {"name": "Valentina", "age": 21, "height": 172, "is_active": True}}

To delete a key you only have to give it a value None.

fiable_db.update(4, {"height": None})
# {"id": 4, "rev": 4, "table": "default", "data": {"name": "Valentina", "age": 21, "is_active": True}}

To overwrite the dictionary, use the force=True:

fiable_db.update(4, {"name": "Javier", "email": "foo@example.com"}, force=True)
# {"id": 4, "rev": 5, "table": "default", "data": {"name": "Javier", "email": "foo@example.com"}}

Step 4: Delete

You can be specific by using the id.

fiable_db.delete(id=4)
# {"id": 4, "rev": 6, "table": "default", "data": None}

And you can delete by performing a search for their values:

fiable_db.delete(data={"name": "Javier"})
# {"id": 4, "rev": 6, "table": "default", "data": None}

Step 5: Find one

Search by id.

fiable_db.find_one(id=2)
# {"id": 2, "rev": 1, "table": "default", "data": {"name": "Noelia", "age": 34, "height": 165}}

Search by value. It will give you the first match.

fiable_db.find_one(data={"name": "Noelia"})
# {"id": 2, "rev": 1, "table": "default", "data": {"name": "Noelia", "age": 34, "height": 165}}

Search by several values.

fiable_db.find_one(data={"name": "Noelia", "age": 34})
# {"id": 2, "rev": 1, "table": "default", "data": {"name": "Noelia", "age": 34, "height": 165}}

If there are no results it will return a None.

fiable_db.find_one(data={"name": "Noelia", "is_active": False})
# None

Step 6: Find all

fiable_db.find_all(data={"age": 41})
# [
#      {"id": 1, "rev": 1, "table": "default", "data": {"name": "Miguel", "age": 41, "height": 189}},
#      {"id": 3, "rev": 1, "table": "default", "data": {"name": "Juan", "age": 41, "height": 187}},
# ]

If no results are found it will return an empty list.

fiable_db.find_all(data={"age": 88})
# []

Step 7: See previous revisions

At any time you can view the previous information of any row using the rev parameter.

Example: Previous version to be deleted.

fiable_db.find_one(id=4, rev=3)
# {"id": 4, "rev": 3, "table": "default", "data": {"name": "Valentina", "age": 21, "height": 172, "is_active": True}}

For convenience, you can use negative numbers. -1 will be the previous state, -2 is 2 states back, etc.

fiable_db.find_one(id=4, rev=-1)
# {"id": 4, "rev": 3, "table": "default", "data": {"name": "Valentina", "age": 21, "height": 172, "is_active": True}}

fiable_db.find_one(id=4, rev=-2)
# {"id": 4, "rev": 2, "table": "default", "data": {"name": "Valentina", "age": 21, "height": 172}}

Step 8: Working with tables or collections.

You can create as many tables as you want. The default table is called default. If you want to work in another table, just use the table attribute in any of the above functions.

fiable_db.add({"name": "Luciano", "age": 54, "height": 165}, table="users")
# {"id": 1, "rev": 1, "table": "users", "data": {"name": "Luciano", "age": 54, "height": 165}}

fiable_db.find_one(id=1, table="users") # "users" table
# {"id": 1, "rev": 1, "table": "users", "data": {"name": "Luciano", "age": 54, "height": 165}}

fiable_db.find_one(id=1) # Default table
# {"id": 1, "rev": 1, "table": "default", "data": {"name": "Miguel", "age": 41, "height": 189}}

You can use the table parameter with any function.

fiable_db.update(1, {"age", 10}, table="users")
# {"id": 1, "rev": 2, "table": "users", "data": {"name": "Luciano", "age": 10, "height": 165}}

fiable_db.delete(1, table="users")
# {"id": 1, "rev": 3, "table": "users", "data": {"name": "Luciano", "age": 10, "height": 165}}

fiable_db.find_all(id=1, table="users")

Step 9: Save changes

Save the database to a file.

fiable_db.save()

Other help functions

Get all data

Get all data from the database.

fiable_db.get_database()

Load file

Load a file into the database.

fiable_db.load(filename)

Save file

Save a file into the database.

fiable_db.save(filename)

Implementations in other languages


Thanks to the power of 🐍 Python 🐍