zoukankan      html  css  js  c++  java
  • 元类,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()
  • 相关阅读:
    Excel文档间的数据替换 ---电脑版APP 自动操作魔法师
    【css】zSass
    【javascript】利用 a 标签自动解析 url
    【javascript】console 让 js 调试更简单
    【规范】javascript 变量命名规则
    【规范】前端编码规范——一般规范
    【jquery】一款不错的音频播放器——Amazing Audio Player
    【分享】分享一款不错的网页视频播放器
    【分享】分享一个值得前端开发收藏的网站
    【html】button按钮的一些问题
  • 原文地址:https://www.cnblogs.com/wutanghua/p/11047924.html
Copyright © 2011-2022 走看看