zoukankan      html  css  js  c++  java
  • ORM基本操作回顾

    连接数据库

    默认是MySQLdb
    指定引擎
    dialect[+driver]: //user:password@host/dbname[?key=value..]:

    from sqlalchemy import create_engine
    engine = create_engine("mysql+pymysql://root:root@127.0.0.1/ormreview?charset=utf8",
                           encoding='utf8')
    
    # 判断是否连接成功
    with engine.connect() as f:
        result = f.execute("select 1")
        print(result.fetchone())
        print(type(result))
    >>>
    # (1,)
    #<class 'sqlalchemy.engine.result.ResultProxy'>
    

    ORM模型创建

    必须继承自sqlalchemy提供的基类

    from sqlalchemy.ext.declarative import declarative_base
    from datetime import datetime
    
    engine = create_engine("mysql+pymysql://root:root@127.0.0.1/ormreview?charset=utf8",
                           encoding='utf8')
    
    Base = declarative_base(engine)
    
    class Aticle(Base):
        __tablename__ = "article" #表名
        id = Column(Integer,primary_key=True,autoincrement=True)
        title = Column(String(100),nullable=False)
        create_time = Column(DateTime,default=datetime.now,onupdate=datetime.now)  #onupdate:更改数据,更新时间
    

    sqlalchemy常用数据类型:

    Integer:整形。
    Float:浮点类型。
    Boolean:传递True/False进去。
    DECIMAL:定点类型。
    enum:枚举类型。
    Date:传递datetime.date()进去。
    DateTime:传递datetime.datetime()进去。
    Time:传递datetime.time()进去。
    String:字符类型,使用时需要指定长度,区别于Text类型。
    Text:文本类型。
    LONGTEXT:长文本类型。
    添加表,删除表

    Column常用参数:

    default:默认值。
    nullable:是否可空。
    primary_key:是否为主键。
    unique:是否唯一。
    autoincrement:是否自动增长。
    onupdate:更新的时候执行的函数。
    name:该属性在数据库中的字段映射。

    Base.metadata.create_all()
    Base.metadata.drop_all()

    使用session 进行ORM操作

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    
    engine = create_engine("mysql+pymysql://root:root@127.0.0.1/ormreview?charset=utf8",
                           encoding='utf8')
                           
    session = sessionmaker(engine)()
    
    # session: <class 'sqlalchemy.orm.session.Session'>
    
    #调用sessionmaker的  __call__ 方法 , 返回使用元类创建的Session类
    # type(class_.__name__, (class_,), {})
    

    添加数据

    #添加一条记录
        article = Aticle(title = '鲁班来了')  
        session.add(article)  #添加到事务中
        session.commit()
        
    #添加多条记录
    	article1 = Aticle(title='鲁班来了1')
    	article2 = Aticle(title='鲁班来了2')
    	session.add_all([article1,article2])
    	session.commit()
    

    查找

    	session.query(Aticle).all()
    	session.query(Aticle.title).filter(Aticle.title=="鲁班来了").first()
    	session.query(Aticle).filter_by(title="鲁班来了1").first()
    ......
    

    删除

    	session.query(Aticle).first()
    

    修改

        article =session.query(Aticle).first()
        article.title = "大学英语"
        session.commit()
    

    字段类型:

        #DECIMAL 定点类型
        #小数点前6位,4为小数点位数
        max_price = Column(DECIMAL(10,4))
        
    	#Boolean类型
    	is_delete = Column(Boolean)
    	
    	#String类型
    	title = Column(String(100),nullable=False)
    	
    	#DateTime类型
    	create_time = Column(DateTime,default=datetime.now,onupdate=datetime.now)
    	
    	#Text类型
    	content = Column(Text)
    	
    	#Enum类型
    	tag = Column(Enum('美食','美女','美景'),default='美食')
    	
    	#Date类型
    	join_time = Column(DATE)
    	Aticle(title = '呐喊',update_time = date(2019,4,2))
    	
    	#Time类型
    	join_time = Column(TIME)
    	Aticle(title = '呐喊',join_time = time(hour=21,minute=57,second=30))
    
    	#Longtext类型,只在Mysql中存在
    	from sqlalchemy.dialects.mysql import LONGTEXT
    	......
    

    Query 可用参数。

    1. 模型对象
    2. 模型中的属性
    3. 聚合函数 (sum , avg ,min ,max , count......)
          #统计行数量
            count = self.session.query(func.count(table.id)).all()
            
            #avg
            avg = self.session.query(func.count(table.price)).all()
    
    
            #sum
            sum = self.session.query(func.sum(table.price)).all()
    
    
            #max
            max = self.session.query(func.max(table.price)).all()
    
            # 调用__getattr__魔术方法,返回本身对象_FunctionGenerator
            # 调用__call__方法
    

    过滤条件:
    过滤是数据提取的一个很重要的功能,以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过filter方法实现的:

    #equals:
    
    query.filter(User.name == '鲁班七号')
    
    #not equals:
    
    query.filter(User.name != '鲁班七号')
    
    #like:
    #ilike不区分大小写
    
    query.filter(User.name.like('%射手%'))
    
    #in:
    
    query.filter(User.name.in_(['ed','wendy','jack']))
    
    # 同时,in也可以作用于一个Query
    query.filter(User.name.in_(session.query(User.name).filter(User.name.like('%ed%'))))
    
    #not in:
    
    query.filter(~User.name.in_(['ed','wendy','jack']))
    
    #is null:
    
    query.filter(User.name==None)
    
    # 或者是
    query.filter(User.name.is_(None))
    
    #is not null:
    
    query.filter(User.name != None)
    # 或者是
    query.filter(User.name.isnot(None))
    
    #and:
    from sqlalchemy import and_
    query.filter(and_(User.name=='ed',User.fullname=='Ed Jones'))
    # 或者是传递多个参数
    query.filter(User.name=='ed',User.fullname=='Ed Jones')
    # 或者是通过多次filter操作
    query.filter(User.name=='ed').filter(User.fullname=='Ed Jones')
    
    or:
    
    from sqlalchemy import or_  
    query.filter(or_(User.name=='ed',User.name=='wendy'))
    

    查找方法:

    #all(): 返回全部记录的一个列表
    session.query(Article).all()
    # first():返回Query中的第一个值
    session.query(Article).first()
    #one():查找所有行作为一个结果集,如果结果集中只有一条数据,则会把这条数据提取出来,如果这个结果集少于或者多于一条数据,则会抛出异常。总结一句话:有且只有一条数据的时候才会正常的返回,否则抛出异常:
    session.query(table).filter(Aticle.title=="呐喊").one()
    # one_or_none():跟one()方法类似,但是在结果集中没有数据的时候也不会抛出异常。
    
    #scalar():底层调用one()方法,并且如果one()方法没有抛出异常,会返回查询到的第一列的数据
    
    #SQLAlchemy还提供了使用文本SQL的方式来进行查询,这种方式更加的灵活。而文本SQL要装在一个text()方法中,看以下例子:
    
    from sqlalchemy import text
    for user in session.query(User).filter(text("id<244")).order_by(text("id")).all():
        print user.name
    
    #如果过滤条件比如上例中的244存储在变量中,这时候就可以通过传递参数的形式进行构造:
    
    session.query(User).filter(text("id<:value and name=:name")).params(value=224,name='ed').order_by(User.id)
    
    #在文本SQL中的变量前面使用了:来区分,然后使用params方法,指定需要传入进去的参数。另外,使用from_statement方法可以把过滤的函数和条件函数都给去掉,使用纯文本的SQL:
    
    sesseion.query(User).from_statement(text("select * from users where name=:name")).params(name='ed').all()
    
    #使用from_statement方法一定要注意,from_statement返回的是一个text里面的查询语句,一定要记得调用all()方法来获取所有的值。
                
    #values 返回generator
    session.query(table).values(table.title,table.id)
    
    #value 返回一个字段
    session.query(table).value(table.title)
    
    #如果想实现select count(*) from users,可以通过以下方式来实现:
    
    session.query(func.count(*)).select_from(User).scalar()
    
    #当然,如果指定了要查找的表的字段,可以省略select_from()方法:
    
    session.query(func.count(User.id)).scalar()
    
    
    
  • 相关阅读:
    Linux cat命令详解
    Linux终端中文显示乱码
    Linux命令对应的英文全称【转载】
    Linux常用命令学习
    链接Linux工具(SecureCRT)
    Linux下四款常见远程工具比较
    怎么让mysql的id从0开始
    substr 字符串截取
    C#学习笔记(三)——流程控制
    C#学习笔记(二)——变量和表达式
  • 原文地址:https://www.cnblogs.com/donghaoblogs/p/10647531.html
Copyright © 2011-2022 走看看