@@ -514,3 +514,135 @@ async def get_connection_2():
514514 test_complete .set ()
515515 await task_1
516516 await task_2
517+
518+
519+ @pytest .mark .parametrize ("database_url" , DATABASE_URLS )
520+ @async_adapter
521+ async def test_queries_with_raw_api_call (database_url ):
522+ """
523+ Test that the basic `execute()`, `execute_many()`, `fetch_all()``, and
524+ `fetch_one()` interfaces are working as expected being called as raw driver calls.
525+ """
526+ async with Database (database_url ) as database :
527+ async with database .transaction (force_rollback = True ):
528+ # Insert query
529+ if str (database_url ).startswith ('mysql' ):
530+ insert_query = "INSERT INTO notes (text, completed) VALUES (%s, %s)"
531+ else :
532+ insert_query = "INSERT INTO notes (text, completed) VALUES ($1, $2)"
533+
534+ # execute()
535+ values = ("example1" , True )
536+
537+ if str (database_url ).startswith ('postgresql' ):
538+ await database .raw_api_call ('execute' , insert_query , * values )
539+ else :
540+ await database .raw_api_call ('execute' , insert_query , values )
541+
542+ # execute_many()
543+ values = [("example2" , False ), ("example3" , True )]
544+ await database .raw_api_call ('executemany' , insert_query , values )
545+
546+ # Select query
547+ select_query = "SELECT notes.id, notes.text, notes.completed FROM notes"
548+
549+ # fetch_all()
550+ if str (database_url ).startswith ('postgresql' ):
551+ results = await database .raw_api_call ('fetch' , select_query )
552+ elif str (database_url ).startswith ('mysql' ):
553+ results = await database .raw_api_call ('fetchall' , select_query )
554+ elif str (database_url ).startswith ('sqlite' ):
555+ results = await database .raw_api_call ('execute_fetchall' , select_query )
556+
557+ assert len (results ) == 3
558+ # Raw output for the raw request
559+ assert results [0 ][1 ] == "example1"
560+ assert results [0 ][2 ] == True
561+ assert results [1 ][1 ] == "example2"
562+ assert results [1 ][2 ] == False
563+ assert results [2 ][1 ] == "example3"
564+ assert results [2 ][2 ] == True
565+
566+ # # fetch_one()
567+ # import pdb; pdb.set_trace()
568+ # if str(database_url).startswith('postgresql'):
569+ # result = await database.raw_api_call('fetchrow', select_query)
570+ # else:
571+ # result = await database.raw_api_call('fetchone', select_query)
572+ # assert result[1] == "example1"
573+ # assert result[2] == True
574+
575+
576+ @pytest .mark .parametrize ("database_url" , DATABASE_URLS )
577+ @async_adapter
578+ async def test_queries_with_expose_backend_connection (database_url ):
579+ """
580+ Replication of `execute()`, `execute_many()`, `fetch_all()``, and
581+ `fetch_one()` using the raw driver interface.
582+ """
583+ async with Database (database_url ) as database :
584+ async with database .transaction (force_rollback = True ):
585+ # Insert query
586+ if str (database_url ).startswith ('mysql' ):
587+ insert_query = "INSERT INTO notes (text, completed) VALUES (%s, %s)"
588+ else :
589+ insert_query = "INSERT INTO notes (text, completed) VALUES ($1, $2)"
590+
591+ # execute()
592+ values = ("example1" , True )
593+
594+ con = await database .expose_backend_connection ()
595+
596+ if str (database_url ).startswith ('postgresql' ):
597+ await con .execute (insert_query , * values )
598+ elif str (database_url ).startswith ('mysql' ):
599+ cursor = await con .cursor ()
600+ await cursor .execute (insert_query , values )
601+ elif str (database_url ).startswith ('sqlite' ):
602+ await con .execute (insert_query , values )
603+
604+ # execute_many()
605+ values = [("example2" , False ), ("example3" , True )]
606+
607+ if str (database_url ).startswith ('mysql' ):
608+ cursor = await con .cursor ()
609+ await cursor .executemany (insert_query , values )
610+ else :
611+ await con .executemany (insert_query , values )
612+
613+ # Select query
614+ select_query = "SELECT notes.id, notes.text, notes.completed FROM notes"
615+
616+ # fetch_all()
617+ if str (database_url ).startswith ('postgresql' ):
618+ results = await con .fetch (select_query )
619+ elif str (database_url ).startswith ('mysql' ):
620+ cursor = await con .cursor ()
621+ await cursor .execute (select_query )
622+ results = await cursor .fetchall ()
623+ elif str (database_url ).startswith ('sqlite' ):
624+ results = await con .execute_fetchall (select_query )
625+
626+ assert len (results ) == 3
627+ # Raw output for the raw request
628+ assert results [0 ][1 ] == "example1"
629+ assert results [0 ][2 ] == True
630+ assert results [1 ][1 ] == "example2"
631+ assert results [1 ][2 ] == False
632+ assert results [2 ][1 ] == "example3"
633+ assert results [2 ][2 ] == True
634+
635+ # fetch_one()
636+ if str (database_url ).startswith ('postgresql' ):
637+ result = await con .fetchrow (select_query )
638+ else :
639+ cursor = await con .cursor ()
640+ await cursor .execute (select_query )
641+ result = await cursor .fetchone ()
642+
643+ # Raw output for the raw request
644+ assert result [1 ] == "example1"
645+ assert result [2 ] == True
646+
647+ # TODO unittests at the connection level
648+ # TODO (?) Double-check connections are released back to the pool
0 commit comments