week4/2-baby-orm-querying/orm_class.py
2023-09-24 17:16:25 -04:00

60 lines
1.2 KiB
Python

import sqlite3
conn = sqlite3.connect( 'babyorm.db' )
conn.row_factory = sqlite3.Row
c = conn.cursor()
class Model( dict ):
def __init__( self, **kwargs ):
for key, value in kwargs.items():
self[key] = value
@staticmethod
def __build_row( row ):
return dict(zip(row.keys(), row))
@staticmethod
def __parse_args( obj ):
return " AND ".join("{} = '{}'".format(name, value) for name, value in obj.items())
@classmethod
def all( cls ):
c.execute( "SELECT * FROM {}".format(cls.__name__) )
return [ cls(**cls.__build_row( row )) for row in c ]
@classmethod
def get( cls, **kwargs ):
c.execute( "SELECT * FROM {} WHERE {} limit 1".format(
cls.__name__,
cls.__parse_args( kwargs )
) )
return cls( **cls.__build_row( c.fetchone() ) )
@classmethod
def filter( cls, **kwargs ):
c.execute( "SELECT * FROM {} WHERE {} ".format(
cls.__name__,
cls.__parse_args( kwargs )
) )
return [ cls(**cls.__build_row( row )) for row in c ]
###don't touch the code for these
class Users(Model):
pass
class Stocks(Model):
pass
if __name__ == '__main__':
from pprint import pprint
print( 'all' )
pprint( Users.all() )
print( 'get' )
pprint( Users.get(name="Kenny") )
print( 'filter' )
pprint( Users.filter(name="Dr.") )