-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy paths-14 ans
150 lines (110 loc) · 4.14 KB
/
s-14 ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
class DoesNotExist(Exception):
pass
class MultipleObjectsReturned(Exception):
pass
class InvalidField(Exception):
pass
class Student:
def __init__(self,name, age, score):
self.name = name
self.student_id = None
self.age = age
self.score = score
@classmethod
def avg(cls, field, **kwargs):
if field not in ('name','age','score','student_id'):
raise InvalidField
if len(kwargs)>=1:
k=Student.filter(**kwargs)
q="select avg({}) from student where {} ".format(field,k)
else:
q="select avg({}) from student ".format(field)
ans=read_data(q)
return ans[0][0]
@classmethod
def min(cls, field, **kwargs):
if field not in ('name','age','score','student_id'):
raise InvalidField
if len(kwargs)>=1:
k=Student.filter(**kwargs)
q="select min({}) from student where {} ".format(field,k)
else:
q="select min({}) from student ".format(field)
#print(q)
ans=read_data(q)
return ans[0][0]
@classmethod
def max(cls, field, **kwargs):
if field not in ('name','age','score','student_id'):
raise InvalidField
if len(kwargs)>=1:
k=Student.filter(**kwargs)
q="select max({}) from student where {} ".format(field,k)
else:
q="select max({}) from student ".format(field)
#print(q)
ans=read_data(q)
return ans[0][0]
@classmethod
def sum(cls, field, **kwargs):
if field not in ('name','age','score','student_id'):
raise InvalidField
if len(kwargs)>=1:
k=Student.filter(**kwargs)
q="select sum({}) from student where {} ".format(field,k)
else:
q="select sum({}) from student ".format(field)
#print(q)
ans=read_data(q)
return ans[0][0]
@classmethod
def count(cls, field=None, **kwargs):
if field == None:
q="select count(*) from student "
elif field not in ('name','age','score','student_id'):
raise InvalidField
elif len(kwargs)>=1:
k=Student.filter(**kwargs)
q="select count({}) from student where {} ".format(field,k)
else:
q="select count({}) from student ".format(field)
print(q)
ans=read_data(q)
return ans[0][0]
@classmethod
def filter(cls,**kid):
cls.li=[]
cls.operator={'lt':'<','lte':'<=','gt':'>','gte':'>=','neq':'!=','in':'in','contain':''}
if(len(kid))>=1:
l=[]
for x,y in kid.items():
cls.a=x
cls.b=y
field=cls.a
field=field.split('__')
if field[0] not in ('name','age','score','student_id'):
raise InvalidField
if(len(field))==1:
query=" {}='{}'".format(cls.a,cls.b)
elif field[1]=='contains':
query=" {} like '%{}%'".format(field[0],cls.b)
elif field[1]=='in':
query=" {} {} {}".format(field[0],cls.operator[field[1]],tuple(cls.b))
else:
query="{} {} '{}'".format(field[0],cls.operator[field[1]],cls.b)
l.append(query)
x = " and ".join(l)
query= " "+x
return query
def read_data(sql_query):
import sqlite3
connection = sqlite3.connect("students.sqlite3")
crsr = connection.cursor()
crsr.execute(sql_query)
ans= crsr.fetchall()
connection.close()
return ans
# avg_age = Student.avg('age')
# print(avg_age)
#avg_age = Student.count()
#print(avg_age)