Skip to main content

Smart ODM for NoSQL (RethinkDB, Redis, etc.)

Project description

PyNSODM (Python NoSQL Object-Document Mapper)

License: MIT PyPI Python Coverage Status

Simple and powerful ODM for various NoSQL databases (RethinkDB, soon - Clickhouse, Redis, MongoDB, InfluxDB, etc.)

Basic use

from pynsodm.rethinkdb_ext import Storage, BaseModel
from pynsodm.fields import StringField

class User(BaseModel):
    table_name = 'users'

    username = StringField()

storage = Storage(db='test_db')
storage.connect()

user = User(username='test_user')
user.save()

print(user.dictionary)

# {'created': datetime.datetime(2021, 2, 24, 5, 53, 29, 411519, tzinfo=<UTC>), 'id': 'fb95ba98-a663-4f0f-b709-2e1d2eb849bd', 'updated': datetime.datetime(2021, 2, 24, 5, 53, 29, 411530, tzinfo=<UTC>), 'username': 'test_user'}

Installation

pip install pynsodm

Examples

Simple object

from pynsodm.rethinkdb_ext import Storage, BaseModel
from pynsodm.fields import StringField

class User(BaseModel):
    table_name = 'users'

    username = StringField()

storage = Storage(db='test_db')
storage.connect()

user = User(username='test_user')
user.save()

print(user.dictionary)

# {'created': datetime.datetime(2021, 2, 24, 5, 53, 29, 411519, tzinfo=<UTC>), 'id': 'fb95ba98-a663-4f0f-b709-2e1d2eb849bd', 'updated': datetime.datetime(2021, 2, 24, 5, 53, 29, 411530, tzinfo=<UTC>), 'username': 'test_user'}

Field with validation

from pynsodm.rethinkdb_ext import Storage, BaseModel
from pynsodm.fields import StringField
from pynsodm.valids import valid_email
from pynsodm.exceptions import ValidateException

class User(BaseModel):
    table_name = 'users'

    username = StringField()
    email = StringField(valid=valid_email)

storage = Storage(db='test_db')
storage.connect()

try:
  user = User(username='test_user', email='test')
  user.save()
  print('success')
except ValidateException as ex:
  print(str(ex))

# Invalid value

try:
  user = User(username='test_user', email='test@test.loc')
  user.save()
  print('success')
except ValidateException as ex:
  print(str(ex))

# success

print(user.dictionary)

# {'created': datetime.datetime(2021, 2, 24, 7, 8, 11, 262538, tzinfo=<UTC>), 'email': 'test@test.loc', 'id': '8e8fc3d4-6ea3-4219-bbe6-16529fa35a47', 'updated': datetime.datetime(2021, 2, 24, 7, 8, 11, 262550, tzinfo=<UTC>), 'username': 'test_user'}

Delete object

from pynsodm.rethinkdb_ext import Storage, BaseModel
from pynsodm.exceptions import NonexistentIDException


class Test123(BaseModel):
  pass

storage = Storage(db='test_db')
storage.connect()

test = Test123()
test.save()

try:
  get_test = Test123.get(test.id)
  print('success')
except NonexistentIDException as ex:
  print(str(ex))

# success

print(Test123.delete(id=test.id))
# True

try:
  get_test = Test123.get(test.id)
  print('success')
except NonexistentIDException as ex:
  print(str(ex))

# ID is not exist

Advanced Examples. Relations

One-to-One Relation

from pynsodm.rethinkdb_ext import Storage, BaseModel
from pynsodm.fields import StringField, OTORelation


class IDCard(BaseModel):
  table_name = 'idcards'

  number = StringField()

class Person(BaseModel):
  table_name = 'persons'

  first_name = StringField()
  last_name = StringField()

  idcard = OTORelation(IDCard, backfield='person')

storage = Storage(db='test_db')
storage.connect()

idcard = IDCard(number='test123')
idcard.save()

person = Person(first_name='John', last_name='Doe', idcard=idcard)
person.save()

get_person = Person.get(person.id)
print(get_person.idcard.number)
# test123

get_idcard = IDCard.get(idcard.id)
print(get_idcard.person.first_name, get_idcard.person.last_name)
# John Doe

One-to-Many Relation

from pynsodm.rethinkdb_ext import Storage, BaseModel
from pynsodm.fields import StringField, OTMRelation

class Person(BaseModel):
  table_name = 'persons'

  first_name = StringField()
  last_name = StringField()

class Bike(BaseModel):
  table_name = 'bikes'

  model = StringField()
  owner = OTMRelation(Person, backfield='bikes')

storage = Storage(db='test_db')
storage.connect()

person1 = Person(first_name='John', last_name='Doe')
person1.save()

person2 = Person(first_name='Jane', last_name='Doe')
person2.save()

bike1 = Bike(model='Altair MTB HT 26 1.0', owner=person1)
bike1.save()

bike2 = Bike(model='Bicystar Explorer 26"', owner=person1)
bike2.save()

bike3 = Bike(model='Horn Forest FHD 7.1 27.5', owner=person2)
bike3.save()

get_person1 = Person.get(person1.id)

for bike in get_person1.bikes:
  print(bike.model)

# Bicystar Explorer 26"
# Altair MTB HT 26 1.0

Several different relationships

from pynsodm.rethinkdb_ext import Storage, BaseModel
from pynsodm.fields import StringField, OTORelation, OTMRelation


class IDCard(BaseModel):
  table_name = 'idcards'

  number = StringField()

class Person(BaseModel):
  table_name = 'persons'

  first_name = StringField()
  last_name = StringField()
  idcard = OTORelation(IDCard, backfield='person')

class Bike(BaseModel):
  table_name = 'bikes'

  model = StringField()
  number = StringField()
  owner = OTMRelation(Person, backfield='bikes')

storage = Storage(db='test_db')
storage.connect()

idcard1 = IDCard(number='test123')
idcard1.save()

idcard2 = IDCard(number='test456')
idcard2.save()

person1 = Person(first_name='John', last_name='Doe', idcard=idcard1)
person1.save()

person2 = Person(first_name='Jane', last_name='Doe', idcard=idcard2)
person2.save()

bike1 = Bike(model='Altair MTB HT 26 1.0', number='bike123', owner=person1)
bike1.save()

bike2 = Bike(model='Bicystar Explorer 26"', number='bike456', owner=person1)
bike2.save()

bike3 = Bike(model='Horn Forest FHD 7.1 27.5', number='bike789', owner=person2)
bike3.save()

finded_bike1 = Bike.find(number='bike123')[0]
finded_bike2 = Bike.find(number='bike789')[0]

print(finded_bike1.owner.idcard.number)
# test123

print(finded_bike2.owner.idcard.number)
# test456

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pynsodm-0.3.5.tar.gz (11.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pynsodm-0.3.5-py3-none-any.whl (14.4 kB view details)

Uploaded Python 3

File details

Details for the file pynsodm-0.3.5.tar.gz.

File metadata

  • Download URL: pynsodm-0.3.5.tar.gz
  • Upload date:
  • Size: 11.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.8.0

File hashes

Hashes for pynsodm-0.3.5.tar.gz
Algorithm Hash digest
SHA256 3bd63e2ab8973df7d225f04774b184f0a7f3789a33f105323945d38331a87c04
MD5 de0757a34129a571ad6ecbab5c45225e
BLAKE2b-256 6b3bacbfab71b0d2661319b954a9ab459b2e49cfdf05d1eb1e477c0464e80aae

See more details on using hashes here.

File details

Details for the file pynsodm-0.3.5-py3-none-any.whl.

File metadata

  • Download URL: pynsodm-0.3.5-py3-none-any.whl
  • Upload date:
  • Size: 14.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.8.0

File hashes

Hashes for pynsodm-0.3.5-py3-none-any.whl
Algorithm Hash digest
SHA256 137b838fb48a005721b03a1746a5171c7a7a66f79782d37a650fdad38b4cddcf
MD5 88f1eceab72625f4011334155963dedb
BLAKE2b-256 7b517ca8369541cdb7513e520ecad1d78be033a5ce63c1220c5919fdd31aac98

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page