元类,sqlalchemy查询

import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
#创建连接实例
db = sqlalchemy.create_engine("mysql+pymysql://root:123@localhost/sqlalchemydb")
#"数据库类型+数据库模块://用户名:密码@主机/库名"
#定义表
    #定义一个元类的继承类
base = declarative_base(db)

    #开始定义表
class User(base):
    __tablename__ = "user"
    id = sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
    name = sqlalchemy.Column(sqlalchemy.String(32))

if __name__ == "__main__":
    base.metadata.create_all(db)


#进行增删改查
#类似于pymysql 的游标 cursor
from sqlalchemy.orm import sessionmaker

#绑定连接
cursor = sessionmaker(bind=db) #得到的时一个类

session = cursor() #实例化

#
# user = User(
#     id = 1,
#     name = "老边"
# )
#
# session.add(user)
# session.commit()
# session.add_all([
#     User(id = 2, name = "老赵"),
#     User(id = 3, name = "老李")
# ])
# session.commit()
#
# all_data = session.query(User).all() #查所有
# print(all_data) #得到对象
# for data in all_data:
#     print("id:%s__name:%s"%(data.id,data.name))

many_data = session.query(User).filter_by(id = 1) #查多条
data, = many_data
print("id:%s__name:%s" % (data.id, data.name))
# for data in many_data:
#     print("id:%s__name:%s"%(data.id,data.name))

#data = session.query(User).get(ident=3) #查一条,只能以主键查
#print("id:%s__name:%s" % (data.id, data.name))

#删除
    #先查询一条
# data = session.query(User).get(ident=3)
#     #然后删除
# session.delete(data)
#     #然后提交操作
# session.commit()
#
    # 先查询一条
# data = session.query(User).get(ident=2)
#     #然后删除
# data.name = "老李"
#     #然后提交操作
# session.commit()

元类

import pymysql

class Field(object):
    def __init__(self,name,column_type):
        self.name = name
        self.column_type = column_type
    def __str__(self):
        return "<%s:%s>"%(self.name,self.column_type)

class StringField(Field):
    def __init__(self,name):
        super(StringField,self).__init__(name,"varchar(100)")

class IntegerField(Field):
    def __init__(self,name):
        super(IntegerField,self).__init__(name,"int")

class ModelMetaClass(type):
    def __new__(cls, name,bases,attrs):
        '''
        :param name: 类的名称
        :param bases: 类的继承
        :param attrs:  类的属性
        :return:
        '''
        if name == "Model":
            return type.__new__(cls,name,bases,attrs)
        mapping = dict() #空字典
        for k,v in attrs.items(): #遍历属性
            if isinstance(v,Field): #判断属性是否Field的实例
                mapping[k] = v #添加到mapping当中
        for k in mapping.keys(): #返回所有键
            attrs.pop(k) #从属性当中删除
        attrs["__mapping__"] = mapping  #设定__mapping__属性来保存字段
        attrs["__table__"] = name
        return type.__new__(cls,name,bases,attrs)

class Model(dict,metaclass = ModelMetaClass):
    def __init__(self,**kwargs):
        self.db = pymysql.connect(
            host = "localhost",
            user = "root",
            password = "123",
            database = "test"
        )
        self.cursor = self.db.cursor()
        super(Model,self).__init__(**kwargs)

    def __getattr__(self, key):
        return self[key]

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

    def save(self):
        fields = [] #空列表用来存储字段
        args = [] #空列表用来存储字段的值
        for k,v in self.__mapping__.items():
            fields.append(v.name)
            args.append(getattr(self,k,None))
        sql = "insert into %s(%s) values (%s)"%(
            self.__table__,
            ",".join(fields),
            ",".join([repr(str(i)) for i in args]
               )) #sql拼接
        self.cursor.execute(sql)
        print(sql)
    def __del__(self):
        '''
        回收内存
        '''
        self.db.commit()
        self.cursor.close()
        self.db.close()

class Student(Model):
    name = StringField("name")
    room_id = IntegerField("room_id")

u = Student(name = "老边",room_id = 18)
u.save()

 

posted @ 2019-06-28 22:17  爱学习的小猫咪  阅读(254)  评论(0编辑  收藏  举报