Sqlalchemy使用

2019-06-12 18:29:26阅读 184评论 0

1.创建数据库

新建一个文件create_tale.py,此文件为基础文件,写入如下:

    from sqlalchemy import create_engine  
    from sqlalchemy.ext.declarative import declarative_base  
    from sqlalchemy import Column,String,Integer,ForeignKey  

    Base=declarative_base()#定义基类  

    class user(Base):  
        __tablename__='user'  
        id=Column(Integer,primary_key=True,nullable=False,index=True)  
        name=Column(String(50),primary_key=True,nullable=False)  
        article=Column(Integer,ForeignKey('article.id'))  

    class article(Base):  
        __tablename__='article'  
        id = Column(Integer, primary_key=True, nullable=False, index=True)  
        name = Column(String(50), primary_key=True, nullable=False)  

    engine=create_engine('mysql+pymysql://root:@127.0.0.1:3306/test1')#连接数据库  
    Base.metadata.create_all(engine)#将所有继承基类的类生成到数据库中

2.数据库基本操作

新建一个py文件,可执行增、删、改、查操作

1)新增

    from create_table import engine  
    from sqlalchemy.orm import sessionmaker  
    session_window=sessionmaker(engine)  
    db_session=session_window()#构建执行sql的窗口  

    #单个数据新增  
    from create_table import user  
    user_obj=user(name='zhanghuan')#构建sql语句  
    db_session.add(user_obj)#将sql语句添加到执行窗口  
    db_session.commit()#提交  
    db_session.close()#关闭窗口  

    #批量新增  
    obj_list=[user(name='abc'),user(name='abc1'),user(name='abc2')]  
    db_session.add_all(obj_list)  
    db_session.commit()  
    db_session.close()

2)删除

    db_session.query(user).filter_by(id=2).delete()  
    db_session.commit()  
    db_session.close()

3)修改

(1)字典形式

    db_session.query(user).filter_by(id=2).update({'name':'zhanghuan'})  
    db_session.commit()  
    db_session.close()

(2)对象形式

    db_session.query(Student).filter(Student.id==7).update({Student.name:'mafeifei'},synchronize_session=False)  
    db_session.commit()  
    db_session.close()

4)查看

(1)filter和filter_by
    res1=db_session.query(user).filter_by(id=2)  
    print(res1)  
    res2=db_session.query(user).filter(user.id==2)  
    print(res2)  
    #返回结果时sql语句,推荐使用第二种

结果

    SELECT user.id AS user_id, user.name AS user_name   
    FROM user   
    WHERE user.id = %(id_1)s  
    SELECT user.id AS user_id, user.name AS user_name   
    FROM user   
    WHERE user.id = %(id_1)s  

    Process finished with exit code 0
(2)filter()参数详解

参数必须是以对象取出的属性为基础的判断条件,即"对象.属性……",如student.id>1

一般条件

如student.id>1,student.id<100,student.id==20

带范围条件

使用前需要导入from sqlalchemy.sql import and_,or_

如and_(student.id>1,student.name='zhanghuan')或者or_(student.id>1,student.name='zhanghuan')

模糊查询条件

如user.name.like('z%')或~user.name.like('z%')

(3)first()和all()
    res3=db_session.query(user).filter(user.id==2).first()#这个返回的是单个数据  
    print(type(res3))  
    res4=db_session.query(user).filter(user.id==2).all()#这个返回的是列表  
    print(type(res4))

结果:

    <class 'create_table.user'>  
    <class 'list'>  

    Process finished with exit code 0
(4)order_by()

结果排序,asc()正序,desc()倒序

    res5=db_session.query(user).filter(user.name.like('a%')).order_by(user.id.desc()).all()  
    for item in res5:  
        print(item.id)

结果

    10  
    9  
    8  
    7  
    6  
    5  
    4  
    3  

    Process finished with exit code 0
(5)offset()
    res5=db_session.query(user).offset(5).all()#偏移前5个数据,数据id从2开始  
    for item in res5:  
        print(item.id)

结果

    7  
    8  
    9  
    10  

    Process finished with exit code 0
(6)聚合函数

max(),sum(),min(),avg()

    from sqlalchemy.sql import func  
    res5=db_session.query(func.avg(user.id)).group_by(user.group_id).all()  
    print(res5)

结果

    [(Decimal('2.0000'),), (Decimal('4.5000'),)]  

    Process finished with exit code 0
(7)text()

可传参数的筛选判断条件

    from sqlalchemy.sql import text res=session.query(Student).filter(text('id<:id and name=:name')).params(id=4,name='zhanghuan').all()  
    for row in res:  
        print(row.id,row.name)

结果

    1 zhanghuan  

    Process finished with exit code 0
(8)from_statement()

原生sql语句查询

    res=session.query(Student).from_statement(text('select * from Student where id>1')).all()  
    for row in res:  
        print(row.id,row.name)

结果

    2 周杰伦  
    3 林俊杰  
    4 卢本伟  

    Process finished with exit code 0

另外,execute()也可以

3.一对多操作

models文件

    from sqlalchemy import create_engine  
    from sqlalchemy.ext.declarative import declarative_base  
    from sqlalchemy import Column,Integer,String,ForeignKey  
    from sqlalchemy.orm import relationship  

    Base=declarative_base()  
    engine=create_engine('sqlite:////home/zhanghuan/Desktop/test.db')  

    class Student(Base):  
        __tablename__='student'  
        id=Column(Integer,primary_key=True,autoincrement=True)  
        name=Column(String(20))  
        grade_id=Column(Integer,ForeignKey('grade.id'))  
        std2gra=relationship('Grade',backref='gra2stu')  

    class Grade(Base):  
        __tablename__='grade'  
        id=Column(Integer,primary_key=True,autoincrement=True)  
        name=Column(String(20))  

    Base.metadata.create_all(engine)

views文件

    from models import engine  
    from sqlalchemy.orm import sessionmaker  

    from models import Student,Grade  

    session_window=sessionmaker(engine)  
    session=session_window()  

1.新增数据

1)向本表和外键关联的表中同时新增数据
新增一条数据,外键通过relationship添加,不走grade_id,
结果为在student表中新增一条数据zhanghuan,同时新增一条数据grade7到grade里,并且与新增u的zhanghuan进行关联
现实中没有这样的应用场景

    std_obj=Student(name='zhanghua',std2gra=Grade(name='grade7'))  
    session.add(std_obj)  
    session.commit()  
 

2)向本表中新增一条数据

    std_obj=Student(name='zhanghua',grade_id=1)  
    session.add(std_obj)  
    session.commit()  

2.查找数据

1)正向查找

    result=session.query(Student).filter(Student.id>1).all()  
    for row in result:  
        print(row.id,row.name,row.std2gra.name)  

结果

    2 zhanghua grade5  
    3 zhanghua grade6  
    4 zhanghua grade1  
    5 zhanghua grade1  

    Process finished with exit code 0  

2)反向查找

    result=session.query(Grade).filter(Grade.id==1).first()  
    print(result.id,result.name,result.gra2std)  
    for item in result.gra2std:  
        print(item.id,item.name,item.grade_id)  

结果

    1 grade1 [<models.Student object at 0x7fdbdda63a20>, <models.Student object at 0x7fdbdda63a90>]  
    4 zhanghua 1  
    5 zhanghua 1  

    Process finished with exit code 0  

4.多对多操作

1)models文件

    from sqlalchemy import create_engine  
    from sqlalchemy.ext.declarative import declarative_base  
    from sqlalchemy import Column,Integer,String,ForeignKey  
    from sqlalchemy.orm import relationship  

    Base=declarative_base()  
    engine=create_engine('sqlite:////home/zhanghuan/Desktop/test1.db')  

    class Student(Base):  
        __tablename__='student'  
        id=Column(Integer,primary_key=True,autoincrement=True)  
        name=Column(String(20))  
        stu2cou=relationship('Course',backref='cou2stu',secondary='st2cou')  

    class Course(Base):  
        __tablename__='course'  
        id=Column(Integer,primary_key=True,autoincrement=True)  
        name=Column(String(20))  

    class St2cou(Base):  
        __tablename__='st2cou'  
        id=Column(Integer,primary_key=True,autoincrement=True)  
        student_id=Column(Integer,ForeignKey('student.id'))  
        course_id=Column(Integer,ForeignKey('course.id'))  

    Base.metadata.create_all(engine)

2)views文件

    from models import engine  
    from sqlalchemy.orm import sessionmaker  

    from models import Student,Course,St2cou  
    from sqlalchemy.sql import text  

    session_window=sessionmaker(engine)  
    session=session_window()  
 
(1)新增

1)往student和course里分别增加一条数据zhanghuan,语文,并产生关联

    obj=Student(name='zhanghuan',stu2cou=[Course(name='语文'),])  
    session.add(obj)  
    session.commit()  

2)在student里新增一条数据,并与已有course进行关联

    obj1=Student(name='马飞飞2')  
    obj2=session.query(Course).filter(Course.id==1).first()  
    obj3=session.query(Course).filter(Course.id==2).first()  
    obj4=session.query(Course).filter(Course.id==3).first()  
    obj1.stu2cou.append(obj2)  
    obj1.stu2cou.append(obj3)  
    obj1.stu2cou.append(obj4)  
    session.add(obj1)  
    result=session.commit()  
    print(result)  

(2)删除

直接在关系表中删除即可

    session.query(St2cou).filter(St2cou.student_id==7).delete()  
    session.commit()  

(3)更新

1.关系表中删除相关关系
2.重新向关系表中新增关系

(4)查询

1)正向查询

    res=session.query(Student).filter(Student.id==7).first().stu2cou  
    for row in res:  
        print(row.id,row.name) 
    1 语文  
    2 数学  
    3 物理  
    4 化学  

    Process finished with exit code 0  


2)反向查询

    res=session.query(Course).filter(Course.id==1).first().cou2stu  
    for row in res:  
        print(row.id,row.name)  
    1 zhanghuan  
    6 马飞飞1  
    7 mafeifei  

    Process finished with exit code 0  

还没有评论,来说两句吧