def select_and_update(): """" show how we can select a specific record, and then search and read through several records """ logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) database = SqliteDatabase('../data/personjob.db') try: database.connect() database.execute_sql('PRAGMA foreign_keys = ON;') logger.info('Find and display by selecting a spcific Person name...') # Peewee provides us with the get() method aperson = Person.get(Person.person_name == 'Susan') logger.info(f'{aperson.person_name} lives in {aperson.lives_in_town} ' + \ f' and likes to be known as {aperson.nickname}') logger.info('Search and display all Person with missing nicknames') logger.info( 'Our person class inherits select(). Specify search with .where()') logger.info('Peter gets a nickname but noone else') # We also get a select() and where() method that we can use for person in Person.select().where(Person.nickname is None): logger.info( f'{person.person_name} does not have a nickname; see: {person.nickname}' ) if person.person_name == 'Peter': logger.info('Changing nickname for Peter') logger.info('Update the database') person.nickname = 'Painter' person.save() else: logger.info(f'Not giving a nickname to {person.person_name}') logger.info( 'And here is where we prove it by finding Peter and displaying') aperson = Person.get(Person.person_name == 'Peter') logger.info( f'{aperson.person_name} now has a nickname of {aperson.nickname}') except Exception as e: logger.info(e) finally: database.close()
def cant_change_pk(): """ show that PKs cant be changed (and that there is no error!) """ logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) logger.info("Back to Person class: try to change Peter's name") aperson = Person.get(Person.person_name == 'Peter') logger.info(f'Current value is {aperson.person_name}') logger.info('Update Peter to Peta, thereby trying to change the PK...') database = SqliteDatabase('../data/personjob.db') try: try: with database.transaction(): aperson = Person.get(Person.person_name == 'Peter') aperson.person_name = 'Peta' aperson.save() logger.info(f'Tried to change Peter to {aperson.person_name}') except Exception as e: logger.info(f'Cant change a PK and caught you trying' ) # not caught; no error thrown by Peewee logger.info(e) aperson = Person.get(Person.person_name == 'Peter') logger.info(f'Looked for Peter: found! -> {aperson.person_name}') try: aperson = Person.get(Person.person_name == 'Peta') except Exception as e: logger.info( f'Looking for Peta results in zero records. PK changes are ignored and do not throw an ' f'error!!!!') logger.info(f'Cant change a PK') logger.info( 'PK "change" can only be achieved with a delete and new create' ) finally: database.close()
def join_classes(): """ demonstrate how to join classes together : no matches too """ logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) database = SqliteDatabase('../data/personjob.db') logger.info( 'View matching records and Persons without Jobs (note LEFT_OUTER)') try: database.connect() database.execute_sql('PRAGMA foreign_keys = ON;') query = (Person.select(Person, Job).join(Job, JOIN.LEFT_OUTER)) for person in query: try: logger.info( f'Person {person.person_name} had job {person.job.job_name}' ) except Exception as e: logger.info(f'Person {person.person_name} had no job') logger.info('Example of how to summarize data') logger.info('Note select() creates a count and names it job_count') logger.info('group_by and order_by control level and sorting') query = (Person.select(Person, fn.COUNT(Job.job_name).alias('job_count')).join( Job, JOIN.LEFT_OUTER).group_by(Person).order_by( Person.person_name)) for person in query: logger.info(f'{person.person_name} had {person.job_count} jobs') except Exception as e: logger.info(e) finally: database.close()
def add_and_delete(): """" show how we can add a record, and delete a record """ logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) database = SqliteDatabase('../data/personjob.db') try: database.connect() database.execute_sql('PRAGMA foreign_keys = ON;') logger.info('Add and display a Person called Fred; then delete him...') logger.info('Add Fred in one step') new_person = Person.create(person_name='Fred', lives_in_town='Seattle', nickname='Fearless') new_person.save() logger.info('Show Fred') aperson = Person.get(Person.person_name == 'Fred') logger.info( f'We just created {aperson.person_name}, who lives in {aperson.lives_in_town}' ) logger.info('but now we will delete him...') aperson.delete_instance() logger.info( 'Reading and print all Person records (but not Fred; he has been deleted)...' ) for person in Person: logger.info( f"{person.person_name} lives in {person.lives_in_town} and likes to be known as {person.nickname}" ) except Exception as e: logger.info(e) finally: database.close()
def populate_db(): """ add person data to database """ logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) database = SqliteDatabase('../data/personjob.db') logger.info('Working with Person class') logger.info( 'Note how I use constants and a list of tuples as a simple schema') logger.info( 'Normally you probably will have prompted for this from a user') person_name = 0 lives_in_town = 1 nickname = 2 people = [ ('Andrew', 'Sumner', 'Andy'), ('Peter', 'Seattle', None), ('Susan', 'Boston', 'Beannie'), ('Pam', 'Coventry', 'PJ'), ('Steven', 'Colchester', None), ] logger.info('Creating Person records: iterate through the list of tuples') logger.info('Prepare to explain any errors with exceptions') logger.info('and the transaction tells the database to fail on error') try: database.connect() database.execute_sql('PRAGMA foreign_keys = ON;') for person in people: with database.transaction(): new_person = Person.create(person_name=person[person_name], lives_in_town=person[lives_in_town], nickname=person[nickname]) new_person.save() logger.info('Database add successful') logger.info('Print the Person records we saved...') for saved_person in Person: logger.info(f'{saved_person.person_name} lives in {saved_person.lives_in_town} ' + \ f'and likes to be known as {saved_person.nickname}') except Exception as e: logger.info(f'Error creating = {person[person_name]}') logger.info(e) logger.info('See how the database protects our data') finally: logger.info('database closes') database.close()
def join_classes(): """ demonstrate how to join classes together : matches """ logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) database = SqliteDatabase('personjob.db') logger.info('Working with Job class') logger.info( 'Now resolve the join and print (INNER shows only jobs that match person)...' ) logger.info('Notice how we use a query variable in this case') logger.info('We select the classes we need, and we join Person to Job') logger.info( 'Inner join (which is the default) shows only records that match') try: database.connect() database.execute_sql('PRAGMA foreign_keys = ON;') query = (Person.select( Person, Job, Department).join(Job).switch(Person).join(Department)) logger.info('View matching records from both tables') for person in query: logger.info( f'Person {person.person_name} had job {person.job.job_name} in the {person.department.department_name} department ' ) except Exception as e: logger.info(f'Error creating = {job[JOB_NAME]}') logger.info(e) finally: logger.info('database closes') database.close()
def add_with_without_bk(): """ demonstrate impact of business keys """ person_name = 0 lives_in_town = 1 nickname = 2 people = [ ('Andrew', 'Sumner', 'Andy'), ('Peter', 'Seattle', None), ('Susan', 'Boston', 'Beannie'), ('Pam', 'Coventry', 'PJ'), ('Steven', 'Colchester', None), ] logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) database = SqliteDatabase('../data/personjob.db') logger.info('Try creating Person records again: it will fail') try: database.connect() database.execute_sql('PRAGMA foreign_keys = ON;') try: with database.transaction(): for person in people: new_person = Person.create( person_name=person[person_name], lives_in_town=person[lives_in_town], nickname=person[nickname]) new_person.save() logger.info('Database add successful') except Exception as e: logger.info(f'Error creating = {person[person_name]}') logger.info(e) logger.info( 'We make sure duplicates are not unintentionally created this way') logger.info('BUT: how do we really identify a Person (uniquely)?') logger.info( 'Creating Person records, but in a new table with generated PK...') try: with database.transaction(): for person in people: new_person = PersonNumKey.create( person_name=person[person_name], lives_in_town=person[lives_in_town], nickname=person[nickname]) new_person.save() except Exception as e: logger.info(f'Error creating = {person[0]}') logger.info(e) logger.info('Watch what happens when we do it again') try: with database.transaction(): for person in people: new_person = PersonNumKey.create( person_name=person[person_name], lives_in_town=person[lives_in_town], nickname=person[nickname]) new_person.save() except Exception as e: logger.info(f'Error creating = {person[0]}') logger.info(e) logger.info( 'Note no PK specified, no PK violation; "duplicates" created!') for person in PersonNumKey.select(): logger.info(f'Name : {person.person_name} with id: {person.id}') except Exception as e: logger.info(e) finally: database.close()