Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
singlestore-labs
GitHub Repository: singlestore-labs/singlestoredb-python
Path: blob/main/singlestoredb/mysql/tests/test_SSCursor.py
469 views
1
# type: ignore
2
import sys
3
4
try:
5
import singlestoredb.mysql as sv
6
from singlestoredb.mysql.tests import base
7
import singlestoredb.mysql.cursors as cursors
8
from singlestoredb.mysql.constants import CLIENT
9
except Exception:
10
# For local testing from top-level directory, without installing
11
sys.path.append('../../..')
12
import singlestoredb.mysql as sv # noqa: F401
13
from singlestoredb.mysql.tests import base
14
import singlestoredb.mysql.cursors as cursors
15
from singlestoredb.mysql.constants import CLIENT
16
17
18
class TestSSCursor(base.PyMySQLTestCase):
19
20
def test_SSCursor(self):
21
# affected_rows = 18446744073709551615
22
affected_rows = -1
23
24
conn = self.connect(
25
client_flag=CLIENT.MULTI_STATEMENTS,
26
cursorclass=cursors.SSCursor,
27
)
28
data = [
29
('America', '', 'America/Jamaica'),
30
('America', '', 'America/Los_Angeles'),
31
('America', '', 'America/Lima'),
32
('America', '', 'America/New_York'),
33
('America', '', 'America/Menominee'),
34
('America', '', 'America/Havana'),
35
('America', '', 'America/El_Salvador'),
36
('America', '', 'America/Costa_Rica'),
37
('America', '', 'America/Denver'),
38
('America', '', 'America/Detroit'),
39
]
40
41
cursor = conn.cursor()
42
43
cursor.execute('DROP TABLE IF EXISTS tz_data')
44
45
# Create table
46
cursor.execute(
47
'CREATE TABLE tz_data ('
48
'region VARCHAR(64),'
49
'zone VARCHAR(64),'
50
'name VARCHAR(64))',
51
)
52
53
conn.begin()
54
# Test INSERT
55
for i in data:
56
cursor.execute('INSERT INTO tz_data VALUES (%s, %s, %s)', i)
57
self.assertEqual(conn.affected_rows(), 1, 'affected_rows does not match')
58
conn.commit()
59
60
# Test fetchone()
61
iter = 0
62
cursor.execute('SELECT * FROM tz_data')
63
while True:
64
row = cursor.fetchone()
65
if row is None:
66
break
67
iter += 1
68
69
# Test cursor.rowcount
70
self.assertEqual(
71
cursor.rowcount,
72
affected_rows,
73
'cursor.rowcount != %s' % (str(affected_rows)),
74
)
75
76
# Test cursor.rownumber
77
self.assertEqual(
78
cursor.rownumber, iter, 'cursor.rowcount != %s' % (str(iter)),
79
)
80
81
# Test row came out the same as it went in
82
self.assertEqual((row in data), True, 'Row not found in source data')
83
84
# Test fetchall
85
cursor.execute('SELECT * FROM tz_data')
86
self.assertEqual(
87
len(cursor.fetchall()),
88
len(data),
89
'fetchall failed. Number of rows does not match',
90
)
91
92
# Test fetchmany
93
cursor.execute('SELECT * FROM tz_data')
94
self.assertEqual(
95
len(cursor.fetchmany(2)),
96
2,
97
'fetchmany failed. Number of rows does not match',
98
)
99
100
# So MySQLdb won't throw "Commands out of sync"
101
while True:
102
res = cursor.fetchone()
103
if res is None:
104
break
105
106
# Test update, affected_rows()
107
cursor.execute('UPDATE tz_data SET zone = %s', ['Foo'])
108
conn.commit()
109
self.assertEqual(
110
cursor.rowcount,
111
len(data),
112
'Update failed. affected_rows != %s' % (str(len(data))),
113
)
114
115
# Test executemany
116
cursor.executemany('INSERT INTO tz_data VALUES (%s, %s, %s)', data)
117
self.assertEqual(
118
cursor.rowcount,
119
len(data),
120
'executemany failed. cursor.rowcount != %s' % (str(len(data))),
121
)
122
123
# Test multiple datasets
124
cursor.execute('SELECT 1; SELECT 2; SELECT 3')
125
self.assertListEqual(list(cursor), [(1,)])
126
self.assertTrue(cursor.nextset())
127
self.assertListEqual(list(cursor), [(2,)])
128
self.assertTrue(cursor.nextset())
129
self.assertListEqual(list(cursor), [(3,)])
130
self.assertFalse(cursor.nextset())
131
132
cursor.execute('DROP TABLE IF EXISTS tz_data')
133
cursor.close()
134
135
136
__all__ = ['TestSSCursor']
137
138
if __name__ == '__main__':
139
import unittest
140
141
unittest.main()
142
143