数据库

10 篇文章 0 订阅
7 篇文章 0 订阅
本文介绍了关系型数据库的基本概念,包括表、主键、外键等,并详细解释了一对多关系如何在模型类中表示。此外,还介绍了SQLAlchemy ORM框架在Python中的应用,以及如何使用Flask-SQLAlchemy进行数据库操作。
摘要由CSDN通过智能技术生成

数据库按照一定规则保存数据,程序发起查询取回所需的数据
关系型数据库将数据存储在表中,表模拟程序中不同的实体
例如:订单管理程序的数据库中可能有的表customers、products、orders

表的列数固定,行数可变
列:
表示实体的数据属性
行:
定义各列对应的真是数据

主键:
是表中 各行的唯一标识符

外键:
引用同一个表或者不同表的某行的主键

关系:
行之间的这种联系称为关系


数据库关系图

roles表
id列:存储的时可用的用户角色,每个角色使用唯一的id值(表的主键)进行标识
name列:
user表
id列:包含用户列表,用户也有唯一的标识符id值
username列:
password列:
role_id列:是外键,引用角色的id,通过这种方法为每个用户指定角色

角色名只出现在一个地方,一旦角色名修改,n那么用户通过role_id可立即看到更新
将数据存储在多个表中
生成包含角色的用户列表,需要从两个表中读取数据,再将其联系起来
关系型数据库引擎为联系操作提供必要的支持

python的数据库框架

mysql、Postgres、SQLite、Redis、MongoDB、CouchDB

数据库抽象层代码包:SQLAlchemy和MongoEngine
使用这些抽象包直接处理高等级的python对象,不用处理对表、文档、查询语言的数据库实体

数据库引擎和数据库抽象层的比较

抽象层也叫对象关系映射(ORM)
功能:
将高层的面向对象的操作转换为底层数据库指令

SQLAlchemy:
是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件
Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作
支持多种数据库后台,SQLAlchemy提供了高层的ORM,也提供了原生SQL的底层功能

使用FLask-SQLAlchemy管理数据库

Flask-SQLAlcenmy是flask扩展,简化程序中使用SQLAlchemy的操作

其中数据库的指定

通过url指定

hostnaem表示mysql服务所在的主机,可以是本地主机localhost,也可以是远程服务器
database表示要使用的数据库名
数据库认证:
username,password表示数据库用户密令

SQLlite 数据库 :不需要使用服务器,不用指定hostname,password,url中的database是硬盘上的文件

程序使用数据库

配置对象
将数据库的url保存在flask配置对象的 SQLALCHEMY_DATABASE_URI
SQLALCHEMY_COMMIT_ON_TABLEDOWN:设为True
每次请求结束后会自动提交数据控中的变动

初始化及配置简单的SQLite数据库

from flask import Flask ,render_template,session,redirect,url_for,flash
from flask.ext.script import Manager
from flask_bootstrap import Bootstrap
from flask.ext.moment import Moment
from flask.ext.wtf import Form
from wtforms import StringField,SubmitField
from wtforms.validators import Required
from flask.ext.sqlalchemy import SQLAlchemy

#将文件路径变为绝对路径
basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config['SECRET_KEY']='hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///'+os.path.join(basedir,'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TABLEDOWN']=True

manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)
form = Form()
#db对象是SQLAlchemy类的实例,表示程序中使用的数据库,获得flask-sqlalchemy中提供的所有功能
db=SQLAlchemy(app)
定义模型

程序使用的持久化实体
ORM中,模型一般是python类,类中的属性对应数据库的列

flask-SQLAlchemy创建的数据库实例,为模型提供了一系列的辅助类和函数,用于定义模型的结构
模型的定义(Role和User模型)

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique = True)

    def __repr__(self):
        return '<Role %r>' % self.name

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer,primary_key = True)
    username = db.Column(db.String(64),unique = True,index = True)

    def __repr__(self):
        return '<User %r>' % self.username


_reper_()方法,返回具有可读性的字符串,表示模型,在调试和测试时使用

关系

关系型数据库使用关系 将不同的表中的行进行联系
下面的关系图表示了用户和角色名之间的简单的联系

一对多关系

此时角色到对象是一对多关系,一个角色名可被多个用户使用
每个用户只能有一个角色

一对多关系在模型类中的表示方法

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique = True)

    Users = db.relationship('User',backref = 'role')

    def __repr__(self):
        return '<Role %r>' % self.name

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer,primary_key = True)
    username = db.Column(db.String(64),unique = True,index = True)

    role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))

    def __repr__(self):
        return '<User %r>' % self.username

db.ForeignKey()
定义了外键
参数:roles.id 表明了这列的值是roles表中行的id值

数据库的操作

创建表
根据模型类创建数据库

db.create_all()

新建了一个名为data.sqlite的文件 ,名字是在配置中设置的
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///'+os.path.join(basedir,'data.sqlite')

如果数据库已经存在,不会重新创建和更新这个表
修改模型后将改动应用都数据库中

更新数据库的粗暴方式先删除旧表,在重新创建

db.drop_all()-->删除数据库表
db.create_all()

但是会将数据库中的所有数据都销毁

插入行

创建角色和用户

admin_role = Role(name = 'Admin')
user_hohn = User(username = 'john',role = admin_role)

id属性是由flask-SQLAlchemy管理的
现在这些对象只存在于python中,没有写入数据库,id尚未赋值

通过数据库会话管理对数据库进行改动

将对象写入数据库之前,会先写入会话中
db.session.add(admin_role)
...

简写:
db.session.add_all([admin_role,user_role,...])

将对象从会话中写入数据库,提交会话

db.session.commit()

此时id属性已经赋值了

数据库会话也称为事物

数据库会话可以回滚:

db.session.rollback()
添加都数据库会话中的对象都会还原到在数据库时的状态

修改行

add()方法更新模型
修改模型实例后提交到数据库中

admin_role.name = 'Administrator'
db.session.add(admin_role)
db.session.commit()
删除行
db.session.delete(admin_role)
db.session.commit()
查询行

flask-sqlalchemy 为每个模型提供了query对象,取回对应表中的所有记录

Role.query.all()
User.query.all()
过滤器配置query,精准查询

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值