Discuss / Python / homework

homework

Topic source

gitKong

#1 Created at ... [Delete] [Delete and Lock User]

简单的拓展一下例子~获取简单的增删改查SQL语句

'MetaClass Define'

__author__ = 'gitkong'

from enum import Enum, unique

class Filed(object):
    def __init__(self, name, colume_type):
        super().__init__()
        self.__name = name
        self.__colume_type = colume_type

    def log(self):
        print(self)

    def __str__(self):
        return self.__class__.__qualname__

class StringFiled(Filed):
    def __init__(self, name):
        super().__init__(name, 'varchar(100)')

class IntegerFiled(Filed):
    def __init__(self, name):
        return super().__init__(name, 'Integer')


class ModelMetaClass(type):
    # attrs {属性名:属性类型,...}
    def __new__(cls, name, bases, attrs):
        # 父类不处理
        if name == 'Model':
            return type.__new__(cls, name, bases, attrs)
        # 声明一个mapper
        mapping = dict()
        for k, v in attrs.items():
            # 判断是不是指定的Filed类
            if isinstance(v, Filed):
                # v.log()
                # 添加参数到mapping中
                mapping[k] = v
        # 移除类属性,防止同名类属性和实例属性冲突  
        for k in mapping.keys():
            attrs.pop(k)
        # 绑定一个字典mapper
        attrs['__mapping__'] = mapping
        # 绑定一个表明为类名
        attrs['__table__'] = name
        # print('attrs = ',attrs)
        return type.__new__(cls, name, bases, attrs)

# 定义一个class派生自dict,定义一个方法生成SQL语句
@unique
class SQLType(Enum):
    NoneType = 0
    Create = 1
    Insert = 2
    Delete = 3
    Select = 4

class Model(dict, metaclass=ModelMetaClass):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    # 重写setter和getter方法,添加属性自动存储到list中
    def __getattr__(self, key):
        try:
            return self[key]
        except:
            raise AttributeError('Read "Model" Object has no attribute "%s"' % key)

    def __setattr__(self, key, value):
        self[key] = value

    # 生成SQL方法
    def getSQL(self,sqlType=SQLType.NoneType):
        fileds, params, args, typeDict = ([], [], [], [])
        if not isinstance(sqlType, SQLType):
            raise TypeError('Error SQL Type, Please Use SQLType')

        # 读取元类中mapping属性
        for k, v in self.__mapping__.items():
            fileds.append(k)
            params.append('?')
            args.append(getattr(self, k))
            typeDict.append('%s %s' % (v, k))

        if SQLType.Create == sqlType:
            return 'CREATE TABLE %s (%s)' % (self.__table__, ','.join(typeDict))
        elif SQLType.Insert == sqlType:
            return 'INSERT INTO %s (%s) VALUES (%s)' % (self.__table__, ','.join(fileds), ','.join(params))
        elif SQLType.Delete == sqlType:
            return 'DELETE FROM %s' % self.__table__
        elif SQLType.Select == sqlType:
            return 'SELECT %s FROM %s' % (','.join(fileds), self.__table__)
        else:
            return 'ARGS:%s' % str(args)

class User(Model):
    id = IntegerFiled('id')
    name = StringFiled('username')
    email = StringFiled('email')
    # password = StringFiled('password')

    

user = User(id = 12345, name = 'gitkong', email = 'xxx.163.com', password = '123')
print(user.getSQL(SQLType.Create))
print(user.getSQL(SQLType.Delete))
print(user.getSQL(SQLType.Insert))
print(user.getSQL(SQLType.Select))
print(user.getSQL())

棒棒的!

Senior198303

#3 Created at ... [Delete] [Delete and Lock User]

楼主的代码结果出来是这样的:

Senior198303

#4 Created at ... [Delete] [Delete and Lock User]

楼主的代码结果出来是这样的:

CREATE TABLE User (IntegerFiled id,StringFiled name,StringFiled email)

DELETE FROM User

INSERT INTO User (id,name,email) VALUES (?,?,?)

SELECT id,name,email FROM User

ARGS:[12345, 'gitkong', 'xxx.163.com']

----------------------------------------------------------------------------------------

代码修改成这样:

原代码:

class Filed(object):    def __init__(self, name, colume_type):        super().__init__()        self.__name = name        self.__colume_type = colume_type

新代码:

class Filed(object):    def __init__(self, name, colume_type):        super().__init__()        self.name = name        self.colume_type = colume_type

原代码:

# 生成SQL方法def getSQL(self,sqlType=SQLType.NoneType):    fileds, params, args, typeDict = ([], [], [], [])    if not isinstance(sqlType, SQLType):        raise TypeError('Error SQL Type, Please Use SQLType')    # 读取元类中mapping属性    # print ("__mapping__",self.__mapping__)    for k, v in self.__mapping__.items():        # print ("v",v)        fileds.append(k)        params.append('?')        args.append(getattr(self, k))        typeDict.append('%s %s' % (v, k))

新代码:

# 生成SQL方法def getSQL(self,sqlType=SQLType.NoneType):    fileds, params, args, typeDict = ([], [], [], [])    if not isinstance(sqlType, SQLType):        raise TypeError('Error SQL Type, Please Use SQLType')    # 读取元类中mapping属性    # print ("__mapping__",self.__mapping__)    for k, v in self.__mapping__.items():        # print ("v",v)        fileds.append(k)        params.append('?')        args.append(getattr(self, k))        typeDict.append('%s %s' % (v.colume_type , k))

这样出来的结果就是这样:

CREATE TABLE User (Integer id,varchar(100) name,varchar(100) email)

DELETE FROM User

INSERT INTO User (id,name,email) VALUES (?,?,?)

SELECT id,name,email FROM User

ARGS:[]


  • 1

Reply