class Field:
def __init__(self, name=None, fieldname=None, pk=False, unique=False, default=False, nullable=True, index=False):
self.name = name
self.fieldname = fieldname
self.pk = pk
self.unique = unique
self.default = default
self.nullable = nullable
self.index = index
def validate(self, value):
raise NotImplementedError
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__[self.name]
def __set__(self, instance, value):
self.validate(value)
instance.__dict__[self.name] = value
def __str__(self):
return '<{} {}>'.format(self.__class__.__name__,self.name)
__repr__ = __str__
class IntField(Field):
def __init__(self, name=None, fieldname=None, pk=False, unique=False, default=False, nullable=True, index=False,auto_increment=False):
self.auto_increment = auto_increment
super().__init__(name, fieldname, pk, unique, default, nullable, index)
def validate(self, value):
if value is None:
if self.pk:
raise TypeError('{} = {} error!!'.format(self.name, value))
if not self.nullable:
raise TypeError('{} = {} error!!'.format(self.name, value))
else:
if not isinstance(value, int):
raise TypeError('{} = {} error!!'.format(self.name, value))
class StringField(Field):
def __init__(self,length=32,name=None, fieldname=None,pk=False,unique=False,default=False,nullable=True,index=False,auto_increment=False):
self.length = length
super().__init__(name,fieldname,pk,unique,default,nullable,index)
def validate(self,value):
if value is None:
if self.pk:
raise TypeError('{} = {} error!!'.format(self.name,value))
if not self.nullable:
raise TypeError('{} = {} error!!'.format(self.name,value))
else:
if not isinstance(value,str):
raise TypeError('{} = {} error!!'.format(self.name,value))
if len(value) > self.length:
raise ValueError('{} is too long,value={}'.format(self.name,value))
class Student:
id = IntField('id')
name = StringField(24,'name')
def __init__(self,id,name):
self.id = id
self.name = name
s = Student(1,name='tom')
print(s.id,s.name)
运行结果:
1 tom
改进:
import pymysql
class Field:
def __init__(self, name=None, fieldname=None, pk=False, unique=False, default=False, nullable=True, index=False):
self.name = name
self.fieldname = fieldname
self.pk = pk
self.unique = unique
self.default = default
self.nullable = nullable
self.index = index
def validate(self, value):
raise NotImplementedError
def __get__(self, instance, owner):
if isinstance is None:
return self
return instance.__class__.__name__,instance.__dict__[self.name],self.__dict__
def __set__(self, instance, value):
self.validate(value)
instance.__dict__[self.name] = value
def __str__(self):
return '<{} {}>'.format(self.__class__.__name__,self.name)
__repr__ = __str__
class IntField(Field):
def __init__(self, name=None, fieldname=None, pk=False, unique=False, default=False, nullable=True, index=False,auto_increment=False):
self.auto_increment = auto_increment
super().__init__(name, fieldname, pk, unique, default, nullable, index)
def validate(self, value):
if value is None:
if self.pk:
raise TypeError('{} = {} error!!'.format(self.name, value))
if not self.nullable:
raise TypeError('{} = {} error!!'.format(self.name, value))
else:
if not isinstance(value, int):
raise TypeError('{} = {} error!!'.format(self.name, value))
class StringField(Field):
def __init__(self,length=32,name=None, fieldname=None,pk=False,unique=False,default=False,nullable=True,index=False,auto_increment=False):
self.length = length
super().__init__(name,fieldname,pk,unique,default,nullable,index)
def validate(self,value):
if value is None:
if self.pk:
raise TypeError('{} = {} error!!'.format(self.name,value))
if not self.nullable:
raise TypeError('{} = {} error!!'.format(self.name,value))
else:
if not isinstance(value,str):
raise TypeError('{} = {} error!!'.format(self.name,value))
if len(value) > self.length:
raise ValueError('{} is too long,value={}'.format(self.name,value))
class Student:
id = IntField('id')
name = StringField(24,'name')
age = IntField('age')
def __init__(self,id,name,age=18):
self.id = id
self.name = name
self.age = age
def save(self,conn:pymysql.connections.Connection):
#连接数据库
#cursor execute(sql)
sql = 'insert into t(id,name,age) values(%s,%s,%s);'
try:
with conn as cursor:
with cursor:
line = cursor.execute(sql,(self.id,self.name,self.age))
conn.commit()
except:
conn.rollback()
#连接数据库
conn = pymysql.connect('172.20.10.11','root','123456','test')
s = Student(1,'haha',27)
s.save(conn)
#返回表名+字段值+字段定义
print(s.id)
print(s.name)
print(s.age)
运行结果:
('Student', 1, {'auto_increment': False, 'unique': False, 'default': False, 'fieldname': None, 'index': False, 'name': 'id', 'pk': False, 'nullable': True})
('Student', 'haha', {'unique': False, 'default': False, 'fieldname': None, 'index': False, 'name': 'name', 'pk': False, 'length': 24, 'nullable': True})
('Student', 27, {'auto_increment': False, 'unique': False, 'default': False, 'fieldname': None, 'index': False, 'name': '