SQLAlchemy中数据库多对多与session
两种数据库的区别:
关系型数据库存取数据很高效,并且避免了重复,但是需要从多个表之中获取数据需要进行联结起来。
nosql 数据库更加适合存储键值对或者文档型,这是减少了表的数量,增加了数据库的重复量,如此以来命名变得很重要,可能需要更新大量的文档(记录每个键值对的含义)。
选择数据库的框架有两种选择!
1,易用性,对象关系映射,使用对象来操作数据库,在用户不知觉的情况下把高层的面向对象操作转换成低层的数据库指令,很简单。
2,性能,ORM 和 ODM 把对象业务转换成数据库业务会有一定的损耗。大多数情况下,这种性能的降低微不足道,但也不一定都是如此。一般情况下,ORM 和 ODM 对生产率的提升远远超过了这一丁点儿的性能降低,所以性能降低这个理由不足以说服用户完全放弃ORM 和 ODM。
数据库多对多操作
from flask import Flask, render_template '''使用 SQLAlchemy 必须使用外键''' # 1----导入flask_sqlalchemy from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 2----配置数据库的链接 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:x@localhost/manager' # 动态追踪修改,如果开启相当与debug模式,加大内存开销! app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 3----实例化SQAlchemy对象,和程序实例进行关联 db = SQLAlchemy(app) '''新建一个表tb_student_course,用来存储两张表的关系(更加底层的写法) 创建两个字段都是外键,并且框架会默认都是主键 ''' tb_student_course = db.Table('tb_student_course', db.Column('student_id', db.Integer, db.ForeignKey('students.id')), db.Column('course_id', db.Integer, db.ForeignKey('courses.id')) ) class Student(db.Model): '''多对多关系可以在任何一个类中定义, backref 参数会处 理好关系的另一侧。关联表就是一个简单的表,不是模型,SQLAlchemy 会自动接管这个表''' __tablename__ = "students" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) '''第一个属性为关联表的属性,第二个属性表示要关联的表,第三个属性表示两者都采用"dynamic"加载方式! 默认的加载方式是select 加载方式,全部加载,dynamic表示只加载对象,不加载数据! backref用于在关系另一端的类中快捷地创建一个指向当前类对象的属性, 而当需要对那个属性指定参数时使用 db.backref() ''' courses = db.relationship('Course', secondary=tb_student_course, backref=db.backref('students', lazy='dynamic') ) class Course(db.Model): __tablename__ = "courses" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) @app.route('/') def hello_world(): return render_template('login.html') if __name__ == '__main__': # 删除表,由于数据的即时更新,让数据有 db.drop_all() # 创建表 db.create_all() stu1 = Student(name='小明') stu2 = Student(name = '小张') cou1 = Course(name='化学') cou2 = Course(name='生物') #第三张表直接按照关系加入即可即可! stu1.courses=[cou1,cou2] stu2.courses=[cou2] db.session.add_all([stu1,stu2,cou2,cou1]) db.session.commit() app.run(debug=True)
flask 中的session:
1,session 与cookie在一起储存的,都是给予键值对的。
2,session 键是存储到浏览器之中的,值是存储到服务器之中的。cookie是存储到浏览器的
3,Session是封装好的模块,是可以将session存储到redis之中,并且会自动比对session的变化。
4,SQLAlchemy中的session是数据库会话对象,保存了对数据的操作
session 两端是如何做到安全的!
1,session 处理过之后直接保存到 cookie中,也叫客户端session(也是直接加密后的session),如果想要存储到服务器必须使用 session_flask。
2,浏览器之中的session 是加密之后的键值对,flask实际上没有真正意义上的session它只是另类的cookie
3,SECRET_KEY 是我们设置的随机数,flask通过它进行加密处理生成键值对存储到redis之中,键返回给浏览器,值用来下次登录进行对比!
可以考虑使用 flask-session 这个三方的库,它把数据保存在服务器端(本地文件、redis、memcached),客户端只拿到一个 sessionid。