Skip to main content

A simple ORM for Python, inspired by ActiveRecord, of Rails framework.

Project description

Pystacho ORM

Setting up the model

from pystacho.model import Model


class Person(Model):
    pass

Find a record by its ID

Usage:

person = Person.find(2)
print(person)

Result:

<class 'models.person.Person'>
SQL--> SELECT * FROM people WHERE id = %s (2,)
Person({'id': 2, 'first_name': 'Paul Eduardo', 'last_name': 'Marclay', 'address': 'Mi address 1234'})

Find a record by different field values

Usage:

person = Person.find_by(id=2, first_name='Paul Eduardo')

Result:

SQL-->  SELECT * FROM people WHERE id = %s AND first_name = %s [2, 'Paul Eduardo']
Person({'id': 2, 'first_name': 'Paul Eduardo', 'last_name': 'Marclay', 'address': 'Mi address 1234'})

Creating a record

Usage:

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

Result:

SQL-->  INSERT INTO people (first_name, last_name, address) VALUES (%s, %s, %s) ['John', 'Doe', 'Missing']
Person({'first_name': 'John', 'last_name': 'Doe', 'address': 'Missing'})

Another usage:

person = Person()
person.first_name = 'Lars'
person.last_name = 'Ulrich'
person.address = 'No address'
person.save()

Result:

SQL-->  INSERT INTO people (first_name, last_name, address) VALUES (%s, %s, %s) ['Lars', 'Ulrich', 'No address']
Person({'first_name': 'Lars', 'last_name': 'Ulrich', 'address': 'No address', 'id': 6})

And you could also do things like this:

Person(first_name='Mike', last_name='Portnoy').save()

Result:

SQL-->  INSERT INTO people (first_name, last_name) VALUES (%s, %s) ['Mike', 'Portnoy']
True

Another way to create a record and get it could be using create() on this way you don't need to to save():

Person.create(first_name='Jason', last_name='Newsted')

Result:

SQL-->  INSERT INTO people (first_name, last_name) VALUES (%s, %s) ['Jason', 'Newsted']
Person({'first_name': 'Jason', 'last_name': 'Newsted', 'id': 8})

Filtering

You can use multiple chained where clauses

Person().where(first_name='Paul Eduardo').where(last_name='marclay')

Result:

SQL-->  SELECT * FROM people WHERE first_name = %s AND last_name = %s ['Paul Eduardo', 'marclay']
Relation(results: [Person({'id': 2, 'first_name': 'Paul Eduardo', 'last_name': 'Marclay', 'address': 'P. del Castillo 480'})])

Even using select and order clauses mixed in

Person.select('id, last_name').where(first_name='test').order(id='desc', last_name='asc')

Result:

SQL-->  SELECT id, last_name FROM people WHERE first_name = %s ORDER BY id desc, last_name asc ['test']
Relation(results: [Person({'id': 10, 'last_name': 'test 2'}), Person({'id': 9, 'last_name': 'test 1'})])

If you need to check the results amount

people = Person.select('id, last_name').where(first_name='test').order(id='desc', last_name='asc')
print(len(people))    

Result:

SQL-->  SELECT id, last_name FROM people WHERE first_name = %s ORDER BY id desc, last_name asc ['test']
2

You could access to the first and last items from the results on an easy way

people = Person.select('id, last_name').where(first_name='test').order(id='desc', last_name='asc')
print(people.first())
print(people.last())

Result:

SQL-->  SELECT id, last_name FROM people WHERE first_name = %s ORDER BY id desc, last_name asc LIMIT 1 ['test']
Relation(results: [Person({'id': 10, 'last_name': 'test 2'})])
SQL-->  SELECT id, last_name FROM people WHERE first_name = %s ORDER BY id desc, last_name asc LIMIT 1 ['test']
Relation(results: [Person({'id': 10, 'last_name': 'test 2'})])

Or maybe you want to iterate over them

people = Person.select('id, last_name').where(first_name='test')
for person in people:
    print(person)

Result:

SQL-->  SELECT id, last_name FROM people WHERE first_name = %s ORDER BY id desc, last_name asc ['test']
Person({'id': 10, 'last_name': 'test 2'})
Person({'id': 9, 'last_name': 'test 1'})

Another way to do an iteration:

for person in Person.where(first_name='test'):
    print(person)

Result:

SQL-->  SELECT * FROM people WHERE first_name = %s ['test']
Person({'id': 9, 'first_name': 'test', 'last_name': 'test 1', 'address': None})
Person({'id': 10, 'first_name': 'test', 'last_name': 'test 2', 'address': None})

You've noticed you can limit queries?

for person in Person.limit(2):
    print(person)

Result:

SQL-->  SELECT * FROM people LIMIT 2 OFFSET 0 []
Person({'id': 2, 'first_name': 'Paul Eduardo', 'last_name': 'Marclay', 'address': 'P. del Castillo 480'})
Person({'id': 3, 'first_name': 'Duam Ignacio', 'last_name': 'Marclay', 'address': None})

On the same way, you cand do somethin like the following

for person in Person.all().limit(2):
    print(person)

Result:

SQL-->  SELECT * FROM people LIMIT 2 OFFSET 0 []
Person({'id': 2, 'first_name': 'Paul Eduardo', 'last_name': 'Marclay', 'address': 'P. del Castillo 480'})
Person({'id': 3, 'first_name': 'Duam Ignacio', 'last_name': 'Marclay', 'address': None})

Two ways of using limit and offset

print(Person.all().limit(1, 2))
print(Person.all().limit(1).offset(2))
SQL-->  SELECT * FROM people LIMIT 1 OFFSET 2 []
Relation(results: [Person({'id': 4, 'first_name': 'John', 'last_name': 'Doe', 'address': 'Missing'})])
SQL-->  SELECT * FROM people LIMIT 1 OFFSET 2 []
Relation(results: [Person({'id': 4, 'first_name': 'John', 'last_name': 'Doe', 'address': 'Missing'})])

Using last()

print(Person.last())
print(Person.last(5))
print(Person.where(first_name='test').last())
print(Person.where(first_name='test').last(2))

Result:

SQL-->  SELECT * FROM people ORDER BY id desc LIMIT 1 []
Relation(results: [Person({'id': 10, 'first_name': 'test', 'last_name': 'test 2', 'address': None})])
SQL-->  SELECT * FROM people ORDER BY id desc LIMIT 5 []
Relation(results: [Person({'id': 10, 'first_name': 'test', 'last_name': 'test 2', 'address': None}), Person({'id': 9, 'first_name': 'test', 'last_name': 'test 1', 'address': None}), Person({'id': 8, 'first_name': 'Jason', 'last_name': 'Newsted', 'address': None}), Person({'id': 7, 'first_name': 'Mike', 'last_name': 'Portnoy', 'address': None}), Person({'id': 6, 'first_name': 'Lars', 'last_name': 'Ulrich', 'address': 'No address'})])
SQL-->  SELECT * FROM people WHERE first_name = %s ORDER BY id desc LIMIT 1 ['test']
Relation(results: [Person({'id': 10, 'first_name': 'test', 'last_name': 'test 2', 'address': None})])
SQL-->  SELECT * FROM people WHERE first_name = %s ORDER BY id desc LIMIT 2 ['test']
Relation(results: [Person({'id': 10, 'first_name': 'test', 'last_name': 'test 2', 'address': None}), Person({'id': 9, 'first_name': 'test', 'last_name': 'test 1', 'address': None})])

Using first() is very similar

print(Person.first())
print(Person.first(5))
print(Person.where(first_name='test').first())
print(Person.where(first_name='test').first(2))

Result:

SQL-->  SELECT * FROM people ORDER BY id asc LIMIT 1 []
Relation(results: [Person({'id': 2, 'first_name': 'Paul Eduardo', 'last_name': 'Marclay', 'address': 'P. del Castillo 480'})])
SQL-->  SELECT * FROM people ORDER BY id asc LIMIT 5 []
Relation(results: [Person({'id': 2, 'first_name': 'Paul Eduardo', 'last_name': 'Marclay', 'address': 'P. del Castillo 480'}), Person({'id': 3, 'first_name': 'Duam Ignacio', 'last_name': 'Marclay', 'address': None}), Person({'id': 4, 'first_name': 'John', 'last_name': 'Doe', 'address': 'Missing'}), Person({'id': 5, 'first_name': 'John', 'last_name': 'Doe', 'address': 'Missing'}), Person({'id': 6, 'first_name': 'Lars', 'last_name': 'Ulrich', 'address': 'No address'})])
SQL-->  SELECT * FROM people WHERE first_name = %s ORDER BY id asc LIMIT 1 ['test']
Relation(results: [Person({'id': 9, 'first_name': 'test', 'last_name': 'test 1', 'address': None})])
SQL-->  SELECT * FROM people WHERE first_name = %s ORDER BY id asc LIMIT 2 ['test']
Relation(results: [Person({'id': 9, 'first_name': 'test', 'last_name': 'test 1', 'address': None}), Person({'id': 10, 'first_name': 'test', 'last_name': 'test 2', 'address': None})])

Do you need to get only ids from a query?, no worries at all!

print(Person.ids())
print(Person.where(first_name='test').ids())

Result:

SQL-->  SELECT id FROM people []
[2, 3, 4, 5, 6, 7, 8, 9, 10]
SQL-->  SELECT * FROM people WHERE first_name = %s ['test']
[9, 10]

Using count to get amount of records of a query

print(Person.count())
print(Person.all().count())
print(Person.where(first_name='test').count())

Result:

SQL-->  SELECT count(*) FROM people []
9
SQL-->  SELECT count(*) FROM people []
9
SQL-->  SELECT count(*) FROM people WHERE first_name = %s ['test']
2

Updating a record

person = Person.find(2)
person.update(first_name='Paul', address='My house 123')

Result:

SQL--> SELECT * FROM people WHERE id = %s (2,)
SQL-->  UPDATE people SET id = %s, first_name = %s, last_name = %s, address = %s WHERE id = 2; [2, 'Paul', 'Marclay', 'My house 123']

Deleting a record

person = Person.find(5)
person.delete()

Result:

SQL--> SELECT * FROM people WHERE id = %s (5,)
SQL-->  DELETE FROM people WHERE id = %s; [5]

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

pystacho-0.1.5.tar.gz (11.6 kB view details)

Uploaded Source

Built Distribution

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

pystacho-0.1.5-py3-none-any.whl (14.8 kB view details)

Uploaded Python 3

File details

Details for the file pystacho-0.1.5.tar.gz.

File metadata

  • Download URL: pystacho-0.1.5.tar.gz
  • Upload date:
  • Size: 11.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.8

File hashes

Hashes for pystacho-0.1.5.tar.gz
Algorithm Hash digest
SHA256 6170628d225347f2c324d83199c80837749af1cc17cd300ad35d2bc5a797d6c2
MD5 7c6cfbd750df48b40d6a51d137b21258
BLAKE2b-256 b55957659f8e7f08110038198d3bfa6be30ff22b8c796ebc57868e0e8471f2e7

See more details on using hashes here.

File details

Details for the file pystacho-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: pystacho-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 14.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.8

File hashes

Hashes for pystacho-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 d84e7772e646a91a366223ead5be097771c268c9b9cbfdc66e44c5b35d8dbdea
MD5 4328152f9ac068a873b98b2f29707384
BLAKE2b-256 336bc2899c0822a0e425d258c4c79bbc219e5db84f9e693213c43f624f99ed71

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