元类,sqlalchemy查询

import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
#创建连接实例
db = sqlalchemy.create_engine("mysql+pymysql://root:[email protected]/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()

原文地址:https://www.cnblogs.com/wutanghua/p/11047924.html

时间: 2024-10-12 12:50:03

元类,sqlalchemy查询的相关文章

Django—— ORM查询(sql优化)优化了解,Django(元信息)元类建索引

Django(元信息)元类建索引 索引:索引的一个主要目的就是加快检索表中数据,索引是经过某种算法优化过的,因而查找次数要少的多.可见,索引是用来定位的. class Book(models.Model) name = models.CharField(max_length=64) class Meta: # 自定义表名 db_table = 'table_name' # 联合索引: 索引的一个主要目的就是加快检索表中数据 index_together = ('tag1', 'tag2') #

49 mysql 索引 元类

一 昨日回顾 视图 触发器 事务 什么是事务 逻辑上的一组操作 要么都成功 要么都失败 如何使用 start transaction 开启事务 mysql 默认一条sql就是一个事务 pymysql默认开启事务 rollback 当其中一条失败 就整体回滚 commit 提交事务 特性 原子性 一致性(完整性一致 约束都是正确的) 隔离性 持久性 并发带来的问题 幻读 脏读 不可重复读 隔离级别: read uncommintted  读未提交 read committed    读已提交  脏

深刻理解Python中的元类(metaclass)

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

【原创】Python 对象创建过程中元类, __new__, __call__, __init__ 的处理

原始type: type是最原始的元类,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple, attributes_dict)" 这种语法来使用时, 在__call__方法内使用又会调用type的__new__和__init__方法来创建classname_string的具体类,并初始化类信息.当type(***)调用完成, classname_string代表的类可以用来创建实例了. 元类调用过程

QObject提供了QMetaObject元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化

元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化其中元类又提供了:classInfo,className,构造函数,多重祖先元类,method, property, Enumerator, Signal, Slot等等 http://doc.qt.io/qt-5/qobject.html http://doc.qt.io/qt-5/qmetaobject.html 我感觉Qt的出现,除了提供GUI以外,主要就是提

Python全栈开发之9、面向对象、元类以及单例

前面一系列博文讲解的都是面向过程的编程,如今是时候来一波面向对象的讲解了 一.简介 面向对象编程是一种编程方式,使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用.类就是一个模板,模板里可以包含多个方法(函数),方法里实现各种各样的功能,,对象则是根据模板创建的实例,通过实例,对象可以执行类中的方法,每个对象都拥有相同的方法,但各自的数据可能不同. 二.类.对象和方法 在Python中,定义类是通过class关键字,class后面紧接着是类名,类名通常

Objective-C对象之类对象和元类对象

作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/8592492 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! 作为C语言的超集,面向对象成为Objective-C与C语言的最大区别,因此,对象是Objective-C中最重要的部分之一.目前面向对象的语言有很多,Objective-C中的对象又和其他语言中的对象有什么区别呢?下面来简单介绍Objectiv

.NET 中,编译器直接支持的数据类型称为基元类型(primitive type).基元类型和.NET框架类型(FCL)中的类型有直接的映射关系.

.NET 中,编译器直接支持的数据类型称为基元类型(primitive type).基元类型和.NET框架类型(FCL)中的类型有直接的映射关系. The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single. https://msdn.microsoft.com/zh-cn/library/s

MyPython--&gt;进阶篇--&gt;使用枚举类 元类

当我们需要定义常量时,一个办法是用大写变量2通过整数来定义,例如月份 JAN = 1 FEB = 2 MAR = 3 好处是简单,缺点是类型是int,并且仍然是变量 更好的方法是为这样的枚举类型定义一个class类,然后每个常量都是class的一个唯一实例,python提供了Eum类来实现这个功能 from enum import Enum Month = Enum('Month',('Jan','Feb','Mar','Apr','May')) print(Month.May) for nam