diff --git a/main.py b/main.py index dd20356..7316a85 100644 --- a/main.py +++ b/main.py @@ -2,9 +2,39 @@ import sqlite3 db_name = 'mydb.db' -class BaseModel: - def __init__(self,id): - self.__id = id +class Field: + def __init__(self,name,column_type): + self.name = name + self.type = column_type + def __str__(self): + return f'{self.name}:{self.type}' + +class IntegerField(Field): + def __init__(self,name): + super().__init__(name,'INTEGER') + +class StringField(Field): + def __init__(self,name): + super().__init__(name,'TEXT') + +class ModelMeta(type): + def __new__(cls, name, bases, attrs): + if name == 'BaseModel': + return super().__new__(cls,name,bases,attrs) + + fields = dict() + for k,v in attrs.items(): + if isinstance(v,Field): + fields[k] = v + + attrs['_fields'] = fields + return super().__new__(cls,name,bases,attrs) + + +class BaseModel(metaclass=ModelMeta): + def __init__(self,**kwargs): + for k,v in kwargs.items(): + setattr(self,k,v) #{'name': 'Alex'} self.name = 'Alex' @classmethod def get_by_id(cls,id): @@ -24,6 +54,19 @@ class BaseModel: def save(self): conn = sqlite3.connect(db_name) cursor = conn.cursor() + + fields = [] + values = [] + for name, field in self._fields.items(): + fields.append(field.name) + values.append(getattr(self,name,None)) + + query =f'''INSERT INTO {self.__class__.__name__.lower()}({','.join(fields)}) + VALUES({','.join(['?']*len(values))})''' + + print(query,values) + conn.close() +''' property_list = [f"{k}" for k, v in self.__class__.__dict__.items() if isinstance(v, property)] if self.__id != None: @@ -41,42 +84,28 @@ class BaseModel: cursor.execute(query,property_values) conn.commit() self.__id = cursor.lastrowid - conn.close() +''' + +def validate_email(func): + def wrapper(self,*args,**kwargs): + if hasattr(self,'email'): + if '@' not in self.email: + raise ValueError('Некоректный email') + + return func(self,*args,**kwargs) + return wrapper class User(BaseModel): - def __init__(self,name,email,age,id = None): - super().__init__(id) - self.__name = name - self.__email = email - self.__age = age + id = IntegerField('id') + name = StringField('name') + age = Field('age','REAL') + email = StringField('email') - @property - def name(self): - return self.__name - @name.setter - def name(self,value): - self.__name = value - - @property - def email(self): - return self.__email - - @email.setter - def email(self,value): - if '@' in value: - self.__email = value - else: - raise ValueError('Не корректный адрес почты') - @property - def age(self): - return self.__age - @age.setter - def age(self,value): - if 0 <= value <= 120: - self.__age = value - else: - raise ValueError('Неправильно указан возраст') + @validate_email + def save(self): + super().save() +''' class Product(BaseModel): def __init__(self,name,category,price,id=None): super().__init__(id) @@ -92,15 +121,7 @@ class Product(BaseModel): @property def price(self): return self.__price +''' -product1 = Product('Свинина, шея','Мясные продукты',250) -product1.save() -''' -user2 = User.get_by_id(9) -user2.name = 'Andrey' -user2.save() -user1 = User('Igor','igor@example.com',44) +user1 = User(name='John',age=18, email='john@example.com') user1.save() -user1.age = 55 -user1.save() -'''