11import random
22import sqlite3
3+ import string
34import sys
45import time
6+ import uuid
57from datetime import date , datetime
68
79import pytest
@@ -69,6 +71,62 @@ def test_create_table_and_insert_many(
6971
7072 assert sqlitecloud_results == sqlite3_results
7173
74+ @pytest .mark .parametrize (
75+ "connection" , ["sqlitecloud_dbapi2_connection" , "sqlite3_connection" ]
76+ )
77+ def test_executemany_with_a_iterator (self , connection , request ):
78+ connection = request .getfixturevalue (connection )
79+
80+ class IterChars :
81+ def __init__ (self ):
82+ self .count = ord ("a" )
83+
84+ def __iter__ (self ):
85+ return self
86+
87+ def __next__ (self ):
88+ if self .count > ord ("z" ):
89+ raise StopIteration
90+ self .count += 1
91+ return (chr (self .count - 1 ),)
92+
93+ try :
94+ connection .execute ("DROP TABLE IF EXISTS characters" )
95+ cursor = connection .execute ("CREATE TABLE IF NOT EXISTS characters(c)" )
96+
97+ theIter = IterChars ()
98+ cursor .executemany ("INSERT INTO characters(c) VALUES (?)" , theIter )
99+
100+ cursor .execute ("SELECT c FROM characters" )
101+
102+ results = cursor .fetchall ()
103+ assert len (results ) == 26
104+ finally :
105+ connection .execute ("DROP TABLE IF EXISTS characters" )
106+
107+ @pytest .mark .parametrize (
108+ "connection" , ["sqlitecloud_dbapi2_connection" , "sqlite3_connection" ]
109+ )
110+ def test_executemany_with_yield_generator (self , connection , request ):
111+ connection = request .getfixturevalue (connection )
112+
113+ def char_generator ():
114+ for c in string .ascii_lowercase :
115+ yield (c ,)
116+
117+ try :
118+ connection .execute ("DROP TABLE IF EXISTS characters" )
119+ cursor = connection .execute ("CREATE TABLE IF NOT EXISTS characters(c)" )
120+
121+ cursor .executemany ("INSERT INTO characters(c) VALUES (?)" , char_generator ())
122+
123+ cursor .execute ("SELECT c FROM characters" )
124+
125+ results = cursor .fetchall ()
126+ assert len (results ) == 26
127+ finally :
128+ connection .execute ("DROP TABLE IF EXISTS characters" )
129+
72130 def test_execute_with_question_mark_style (
73131 self , sqlitecloud_dbapi2_connection , sqlite3_connection
74132 ):
@@ -84,20 +142,37 @@ def test_execute_with_question_mark_style(
84142
85143 assert sqlitecloud_results == sqlite3_results
86144
87- def test_execute_with_named_param_style (
88- self , sqlitecloud_dbapi2_connection , sqlite3_connection
89- ):
90- sqlitecloud_connection = sqlitecloud_dbapi2_connection
145+ @pytest .mark .parametrize (
146+ "connection" , ["sqlitecloud_dbapi2_connection" , "sqlite3_connection" ]
147+ )
148+ def test_execute_with_named_param_style (self , connection , request ):
149+ connection = request .getfixturevalue (connection )
91150
92- select_query = "SELECT * FROM albums WHERE AlbumId = :id"
93- params = {"id" : 1 }
94- sqlitecloud_cursor = sqlitecloud_connection .execute (select_query , params )
95- sqlite3_cursor = sqlite3_connection .execute (select_query , params )
151+ select_query = "SELECT * FROM albums WHERE AlbumId = :id and Title = :title and AlbumId = :id"
152+ params = {"id" : 1 , "title" : "For Those About To Rock We Salute You" }
96153
97- sqlitecloud_results = sqlitecloud_cursor .fetchall ()
98- sqlite3_results = sqlite3_cursor .fetchall ()
154+ cursor = connection .execute (select_query , params )
99155
100- assert sqlitecloud_results == sqlite3_results
156+ results = cursor .fetchall ()
157+
158+ assert len (results ) == 1
159+ assert results [0 ][0 ] == 1
160+
161+ @pytest .mark .parametrize (
162+ "connection" , ["sqlitecloud_dbapi2_connection" , "sqlite3_connection" ]
163+ )
164+ def test_executemany_with_named_param_style (self , connection , request ):
165+ connection = request .getfixturevalue (connection )
166+
167+ select_query = "INSERT INTO customers (FirstName, Email, LastName) VALUES (:name, :email, :name)"
168+ params = [
169+ {"name" : "pippo" , "email" : "pippo@disney.com" },
170+ {"name" : "pluto" , "email" : "pluto@disney.com" },
171+ ]
172+
173+ connection .executemany (select_query , params )
174+
175+ assert connection .total_changes == 2
101176
102177 @pytest .mark .skip (
103178 reason = "Rowcount does not contain the number of inserted rows yet"
@@ -1151,11 +1226,47 @@ def test_transaction_context_manager_on_failure(self, connection, request):
11511226 "INSERT INTO albums (Title, ArtistId) VALUES ('Test Album 1', 1)"
11521227 )
11531228 id1 = cursor .lastrowid
1154- connection .execute ("INVALID COMMAND " )
1229+ connection .execute ("insert into pippodd (p) values (1) " )
11551230 except Exception :
11561231 assert True
11571232
11581233 cursor = connection .execute ("SELECT * FROM albums WHERE AlbumId = ?" , (id1 ,))
11591234 result = cursor .fetchone ()
11601235
11611236 assert result is None
1237+
1238+ @pytest .mark .parametrize (
1239+ "connection" ,
1240+ [
1241+ "sqlitecloud_dbapi2_connection" ,
1242+ "sqlite3_connection" ,
1243+ ],
1244+ )
1245+ def test_connection_total_changes (self , connection , request ):
1246+ connection = request .getfixturevalue (connection )
1247+
1248+ new_name1 = "Jazz" + str (uuid .uuid4 ())
1249+ new_name2 = "Jazz" + str (uuid .uuid4 ())
1250+ new_name3 = "Jazz" + str (uuid .uuid4 ())
1251+
1252+ connection .executemany (
1253+ "INSERT INTO genres (Name) VALUES (?)" ,
1254+ [(new_name1 ,), (new_name2 ,)],
1255+ )
1256+ assert connection .total_changes == 2
1257+
1258+ connection .execute (
1259+ "SELECT * FROM genres WHERE Name IN (?, ?)" , (new_name1 , new_name2 )
1260+ )
1261+ assert connection .total_changes == 2
1262+
1263+ connection .execute (
1264+ "UPDATE genres SET Name = ? WHERE Name = ?" , (new_name3 , new_name1 )
1265+ )
1266+ assert connection .total_changes == 3
1267+
1268+ connection .execute (
1269+ "DELETE FROM genres WHERE Name in (?, ?, ?)" ,
1270+ (new_name1 , new_name2 , new_name3 ),
1271+ )
1272+ assert connection .total_changes == 5
0 commit comments