1.SQL数据库与NoSQL数据库
SQL数据库由不同的表组成,表和表之间由关系连接。每个表中存在一列主键,主表中的某列可用其他表的主键表示,这样的关系构成关系型数据库。
NoSQL数据库即Not Only SQL,存在不同类型的NoSQL。
2.Flask - SQLAlchemy
(1)初始化
这里我们还是使用SQLAlchemy数据库。
(venv) $pip install flask-sqlalchemy
在Index.py中配置数据库
from flask_sqlalchemy import SQLAlchemybasedir = os.path.abspath(os.path.dirname(__file__))app = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = Truedb = SQLAlchemy(app)
数据库中的表用类定义,各个属性即为表的列,各个实例即为表的行:
class User(db.Model) __tablename__ = 'users‘ , id = db.Colomn(db.Integer , primary_key = True) username = db.Colomn(db.String(64) , unique = True , index = True) role_id = db.Colomn(db.Integer, db.ForeignKey('roles.id')) def __repr__: return '' % self.username
其中继承db.colomn的变量即为表中的列,示例中定义主键为id,id数据类型为数值型,username列的值不能重复且建立索引,role_id是外键且连接表名为roles的表的id列。
class Role(db.Model): __tablename__ = 'roles' id = db.Colomn(db.Integer , primary_key = True) name = db.Colomn(db.String(64) , unique = True) users = db.relationship('User' , backref = 'role') def __repr__: return '‘ % self.name
此处一个角色很可能有多个用户与其对应,因此其实是一个一对多关系。relationship方法第一个参数设定与其连接的表对应的类,第二个参数backref将在User类中添加role属性,此处role属性可替代role_id的作用,注意此时获取的不是外键的值,而是该实例整体。
在建立了表的基本结构之后,我们在shell中创建表:
(venv) $ python hello.py shell>>> from hello import db>>> db.creat_all()
(2)输入数据
>>> from hello import Role,User>>> admin_role = Role(name = 'Admin')>>> mod_role = Role(name = 'Moderator')>>> user_role = Role(name = 'User')>>> user_John = User(username = 'John', role = admin_role)>>> user_Susan = User(username = 'Susan', role = user_role) >>> user_David = User(username = 'David'), role = user_role)
但此时数据尚未写入数据库,只存在与Python中:
>>> print(admin_role.id)None
首先写入数据库会话
>>> db.session.add(admin_role)>>> db.session.add(mod_role)... ...
或
>>> db.session.add_all([admin_role,mod_role,user_role,user_John,user_Susan,user_David])
提交会话(保存到数据库):
>>> db.session.commit()
(3)编辑数据
修改数据即将数据重新提交一遍:
>>> admin_role.name = ‘Administrator'>>> db.session.add(admin_role)>>> db.session.commit()
删除数据:
>>> db.session.delete(mod_rate)>>> db.session.commit()
(4)查询数据
查询一个表中所有数据:
>>> Role.query.all()[, ]
过滤:
>>> User.query.filter_by(role = user_role).all()[, ]
查看过滤操作的原生SQL语句:
>>> str(User.query.filter_by(role = user_role).all())'SELECT users.id AS users_id , users.username AS users_username , users.role_id AS user_role_id FROM users WHERE :param_1 = users.role_id'
注意在退出shell对话后python对象会被清除,若再要使用需要从数据库中读取:
>>> user_role =Role.query.filter_by(name = 'User').first()
(5)在视图函数里操作数据库:
def index(): name = None form = Nameform() if form.validate_on_submit(): user = User.query.filter_by(username = form.name.data).first() #建立一个查询 if user is None:#如果数据库中没有数据则以提交表单数据为名称在数据库中添加用户 user = User(username = form.name.data) db.session.add(user) session['known'] = False else: session['known'] = True session['name'] = form.name.data return redirect(url_for('index')) flash('Hello Everyone') return render_template('index.html',form = form , name = session.get('name'),known = session.get('known',False))
-