• Flask的sqlalchemy SQL练习


    models.py

    from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, Enum, UniqueConstraint
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker, relationship
    
    
    # 数据库配置信息
    HOST = "127.0.0.1"
    PORT = "3306"
    DATABASE = "数据库名字"
    USERNAME = "用户名"
    PASSWORD = "密码"
    
    
    # 数据库的固定格式
    DB_URL = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset-utf8".format(
    username=USERNAME,
    password=PASSWORD,
    host=HOST,
    port=PORT,
    db=DATABASE
    )
    
    # 创建一个引擎
    engine = create_engine(DB_URL)
    
    # 用declarative_base根据engine创建一个ORM基类
    Base = declarative_base(engine)
    
    
    # 创建一个ORM模型,这个模型继承sqlalchemy给我们提供基类,即上面的Base
    class Depart(Base):
    """班级表"""
    __tablename__ = "depart"
    id = Column(Integer, primary_key=True, autoincrement=True)
    caption = Column(String(64), nullable=False)
    
    def __str__(self):
    return self.caption
    
    def __repr__(self):
    return self.__str__()
    
    
    class Student(Base):
    """学生表"""
    __tablename__ = "student"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(32), nullable=False)
    gender = Column(Enum("", ""))
    # 外键关联
    depart_id = Column(Integer, ForeignKey("depart.id"))
    # 与生成表结构无关,仅用于查询方便, backref指定反向查询字段名(起一个关联当前表的名字)
    departs = relationship("Depart", backref="student_list")
    
    def __str__(self):
    return self.name
    
    def __repr__(self):
    return self.__str__()
    
    
    class Teacher2Student(Base):
    """老师学生多对多关联表"""
    __tablename__ = "teacher2student"
    id = Column(Integer, primary_key=True, autoincrement=True)
    teacher_id = Column(Integer, ForeignKey("teacher.id"))
    student_id = Column(Integer, ForeignKey("student.id"))
    
    
    class Teacher2Depart(Base):
    """老师班级多对多关联表"""
    __tablename__ = "teacher2depart"
    id = Column(Integer, primary_key=True, autoincrement=True)
    teacher_id = Column(Integer, ForeignKey("teacher.id"))
    depart_id = Column(Integer, ForeignKey("depart.id"))
    
    __table_args__ = (
    # 联合唯一索引,加速查找、不重复
    UniqueConstraint('teacher_id', 'depart_id', name='teacher_depart_id'),
    # Index('st_id_name', 'name', 'extra'), # 联合索引,加速查找
    )
    
    
    class Teacher(Base):
    """老师表"""
    __tablename__ = "teacher"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)
    # secondary指定多对多中记录的排序方式,前面的代表关联类名字,后面是反向查询本表的字段名
    students = relationship("Student", secondary="teacher2student", backref="teacher_list")
    departs = relationship("Depart", secondary="teacher2depart", backref="teacher_list")
    
    def __str__(self):
    return self.name
    
    def __repr__(self):
    return self.__str__()
    
    
    class Course(Base):
    """课程表"""
    __tablename__ = "course"
    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(64), nullable=False)
    teacher_id = Column(Integer, ForeignKey("teacher.id"))
    scores = relationship("Score", backref="course_list")
    teachers = relationship("Teacher", backref="course_list")
    
    def __str__(self):
    return self.title
    
    def __repr__(self):
    return self.__str__()
    
    
    class Score(Base):
    """成绩表"""
    __tablename__ = "score"
    id = Column(Integer, primary_key=True, autoincrement=True)
    number = Column(Integer, nullable=False)
    student_id = Column(Integer, ForeignKey("student.id"))
    course_id = Column(Integer, ForeignKey("course.id"))
    students = relationship("Student", backref="score_list")
    
    def __str__(self):
    return self.number
    
    def __repr__(self):
    return self.__str__()
    
    
    # 将创建好的ORM模型,映射到数据库中
    Base.metadata.create_all()
    # ORM对数据库操作需要构建一个session对象
    session = sessionmaker(engine)()
    View Code

    learn_sql.py

    from learn.models import *
    from learn.models import session
    
    
    # 增(需要什么字段添加什么字段)
    obj = Depart(caption="Go全栈")
    session.add(obj)
    session.commit()
    
    
    session.add_all([Course(title="Go基础"), Course(title="Java三大器")])
    session.commit()
    
    
    session.add_all([
    Student(name="小五"),
    Depart(caption="间谍"),
    Teacher(name="海哥"),
    Score(number=90),
    Course(title="翻盘一号"),
    ])
    session.commit()
    # 创建一个新老师,并给他指定两个新学生
    obj = Teacher(name="二筒")
    obj.students = [Student(name="小五", gender="", class_id=2), Student(name="二胖", gender="", class_id=3)]
    session.add(obj)
    session.commit()
    
    
    # 查询Python班级有多少学生
    val = session.query(ClassTable.caption, Student.name).filter(ClassTable.id==1).all()
    查询课程id大于2的所有课程
    val = session.query(Course).filter(Course.id > 2).all()
    # 找到钢蛋的老师
    val = session.query(Student).filter(Student.name=="钢蛋").first()
    for item in val.teacher_list:
    print(item)
    # 查看小王老师教的课程
    val = session.query(Teacher).filter(Teacher.name=="小王").first()
    for item in val.courses:
    print(item)
    
    #
    session.query(Teacher2Student).filter(Teacher2Student.id > 4).delete()
    session.commit()
    session.close()
    
    # 修改学生属性和关联课程
    session.query(Student).filter(Student.id == 8).update({Student.gender: ""})
    session.query(Student).filter(Student.id == 9).update({Student.gender: ""})
    session.query(Student).filter(Student.id == 10).update({Student.class_id: 2})
    session.query(Student).filter(Student.id == 11).update({Student.class_id: 3})
    session.commit()
    View Code
  • 相关阅读:
    linux 开发GTK需要的初始配置
    Kernel panic not syncing: cannot execute a PAEenabled kernel on PAEless CPU
    在NetBeans IDE 6.9.1上搭建Android SDK环境(WIN和Linux平台)
    Gtk+ Tutorials & Resources
    新手上路学习配置C,C++,GTK等开发环境
    又是忙碌的一天
    Graphics Programming on linux using C用c语言开发图形界面
    如何在Netbeans下配置Android开发环境 a platform target has to be selected
    linux终端中最漂亮的几款字体介绍及安装
    自已接触过的数据访问方式总结
  • 原文地址:https://www.cnblogs.com/Guishuzhe/p/9786949.html
Copyright © 2020-2023  润新知