Flask sqlalchemy

今天讲一下flask sqlalchemy

flask sqlalchemy 是基于sqlite3的是orm的一种构架,大部分语法和sqlite3有些类似。简单介绍一下什么是数据库: 正规点的定义就是:数据库是长期存储在计算机内,大量有组织可共享的数据的集合。简单点就是,比如你有一个database(数据库),数据库中有很多表格,就像excel那样子。 表格中有每一列的名字(字段),用来标记每一列是存的什么信息。就这么简单,当然数据还会有些特殊的属性,比如primary key, unique, not null等等。

首先安装命令是:

pip install flask-sqlalchemy

把这个部分的代码命名为config.py

import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy


basedir = os.path.abspath(os.path.dirname(__file__))
# 我们要把数据库放在当下的文件夹,这个basedir就是当下文件夹的绝对路径

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'student.db')
# 这里注意看,写的是URI,用来告诉程序你的数据库在什么地方存着

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config[‘SQLALCHEMY_COMMIT_TEARDOWN'] = True
# SQLALCHEMY_COMMIT_TEARDOWN 因为数据库每次有变动的时候,数据改变,但不会自动的去改变数据库面的数据,
# 只有你去手动提交,告诉数据库要改变数据的时候才会改变,这里配置这个代表着,不需要你手动的去提交了自动帮你提交了。也就是可以忽略 db.session.commit()

db = SQLAlchemy(app)
# 初始化db

这里说一下数据库URL。如果你要链接数据库,得先告诉程序数据库在哪,无论是local的或者remote的。URL就是那个数据库的位置。 

数据库引擎URL
SQLite(Unix)sqlite:absolute/path/to/database
SQLite(Windows)sqlite:///c:/absolute/path/to/database

所以程序使用数据库URL必须保存到Flask配置对象的SQLALCHEMY_DATABASE_URI 键中(既保存的位置)

配置对象中还有一个很有用的选项,即SQLALCHEMY_COMMIT_ON_TEARDOWN 键,将其设为 True时,每次请求结束后都会自动提交数据库中的变动 (所以一般都设置成False)

basedir = os.path.abspath(os.path.dirname(__file__))

○ 将数据库创建在工程的根目录下,在pyhton内使用os定位到工程路径下很方便

○ 将当前文件传入dirname函数中, 获取当前文件所在的路径, abspath表示  a获取该文件所在的绝对路径,后面以便于创建数据库,表示将student.db存在当前目录下

以下代码存在student.py的文件内:

from config import db
class User(db.Model):
    __tablename__ = 'user'
    # 定义一下table的名字
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    zid = db.Column(db.Integer)
    email = db.Column(db.String(120))
    password = db.Column(db.String(120))
    role = db.Column(db.String(80))
     
    def __init__(self, name,zid,email, password, role):
        self.name = name
        self.zid = zid
        self.email = email
        self.password = password
        self.role = role
        
    def __repr__(self):
        return '<User %r>' % self.usernam

这个给大家解释一下为什么要primary key, primary key的中文翻译可以理解为主键,像get等命令都是根据主键来直接查找到的,而且在一对多或者是多对多的关系数据里面是用来创建table来关良两个不同的table

这里是sqlite3 所有的类型 

类型名

Python类型

说 明

Integer

int

普通整数,一般是 32 位

SmallInteger

int

取值范围小的整数,一般是 16 位

BigInteger

int 或 long

不限制精度的整数

Float

float

浮点数

Numeric

decimal.Decimal

定点数

String

str

变长字符串

Text

str

变长字符串,对较长或不限长度的字符串做了优化

Unicode

unicode

变长 Unicode 字符串

UnicodeText

unicode

变长 Unicode 字符串,对较长或不限长度的字符串做了优化

Boolean

bool

布尔值

Date

datetime.date

日期

Time

datetime.time

时间

DateTime

datetime.datetime

日期和时间

Interval

datetime.timedelta

时间间隔

Enum

str

一组字符串

PickleType

任何 Python 对象

自动使用 Pickle 序列化

LargeBinary

str

二进制文件

这些是最常使用的SQLAlchemy列选项

 

 

选项名

说 明

primary_key

如果设为 True ,这列就是表的主键

unique

如果设为 True ,这列不允许出现重复的值

index

如果设为 True ,为这列创建索引,提升查询效率

nullable

如果设为 True ,这列允许使用空值;如果设为 False ,这列不允许使用空值

default

为这列定义默认值

 

 不知道为啥截图就这样了。。。。

在当前文件夹下面进入python3的终端来创造database:

python3
>>> from student import db
>>> db.create_all()

删除所有的表单:

python3
>>> from student import db
>>> db.drop_all()

 

 这时候database已经创建完毕,下面就是往里面存数据 (addStudent.py)

from student import User, db

user1 = User('li','z513','123@qq.com','123','student')
user2 = User('wang','z514','1234@qq.com','123','student')

# 添加数据到数据库
db.session.add(user1)
db.session.add(user2)
#简写:db.session.add_all([user1, user2])
# 表示提交数据

# 修改行
user1.name = 'wang'
db.session.add(user1)
db.session.commit()

# 删除行
db.session.delete(user1)

db.session.commit()

这个地方是用sqlite3的语句查询的结果,接下来教大家用query来查询 

 

from student import *

# 这里表示得到所有的数据, 整个表单的内容
users = User.query.all()

for user in users:
    print('Id: ', user.id, ' Name: ', user.name, ' Zid: ', user.zid, ' Role: ',user.role)

# 也可以根据所需来搜索
print ('>>>   This is filter_by command   <<<')
user = User.query.filter_by(id = 1).first()
print('Id: ', user.id, ' Name: ', user.name, ' Zid: ', user.zid, ' Role: ',user.role)

# 当然还有很多的筛选的语法,还有get, get 要根据primary key来查询
print ('>>>   This is get command   <<<')
user = User.query.get(2)
print('Id: ', user.id, ' Name: ', user.name, ' Zid: ', user.zid, ' Role: ',user.role)

# 也可以用filter进行模糊搜索
print ('>>>   This is filter command   <<<')
# .all()的意思是得到所有的数据
users = User.query.filter(User.role.ilike('%dent')).all()
for user in users:
    print('Id: ', user.id, ' Name: ', user.name, ' Zid: ', user.zid, ' Role: ',user.role)

常用的过滤器:

过滤器

说 明

filter()

把过滤器添加到原查询上,返回一个新查询

filter_by()

把等值过滤器添加到原查询上,返回一个新查询

limit()

使用指定的值限制原查询返回的结果数量,返回一个新查询

offset()

偏移原查询返回的结果,返回一个新查询

order_by()

根据指定条件对原查询结果进行排序,返回一个新查询

group_by()

根据指定条件对原查询结果进行分组,返回一个新查询

最常使用的SQLAlchemy查询执行函数

方 法

说 明

all()

以列表形式返回查询的所有结果

first()

返回查询的第一个结果,如果没有结果,则返回 None

first_or_404()

返回查询的第一个结果,如果没有结果,则终止请求,返回 404 错误响应

get()

返回指定主键对应的行,如果没有对应的行,则返回 None

get_or_404()

返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回 404 错误响应

count()

返回查询结果的数量

paginate()

返回一个 Paginate 对象,它包含指定范围内的结果

 下面会讲多对多的关系

要实现一个带有注册登录功能的管理系统,可以使用 Flask 框架和 SQLAlchemy 库来实现。以下是一个简单的示例: 1. 安装 FlaskSQLAlchemy ```python pip install Flask SQLAlchemy ``` 2. 创建 Flask 应用 ```python from flask import Flask app = Flask(__name__) ``` 3. 配置数据库 ```python from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) ``` 4. 定义用户模型 ```python class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(50), unique=True, nullable=False) password = db.Column(db.String(100), nullable=False) def __repr__(self): return f'<User {self.username}>' ``` 5. 创建数据库表 ```python db.create_all() ``` 6. 创建注册和登录路由 ```python from flask import render_template, request, redirect, url_for, flash from werkzeug.security import generate_password_hash, check_password_hash @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] user = User.query.filter_by(username=username).first() if user: flash('Username already exists.') return redirect(url_for('register')) new_user = User(username=username, password=generate_password_hash(password, method='sha256')) db.session.add(new_user) db.session.commit() flash('Account created.') return redirect(url_for('login')) return render_template('register.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] remember = True if request.form.get('remember') else False user = User.query.filter_by(username=username).first() if not user or not check_password_hash(user.password, password): flash('Incorrect username or password.') return redirect(url_for('login')) session['user_id'] = user.id session['username'] = user.username flash('Logged in successfully.') return redirect(url_for('home')) return render_template('login.html') ``` 7. 创建需要登录才能访问的路由 ```python from flask_login import login_required @app.route('/home') @login_required def home(): return render_template('home.html') ``` 8. 创建注销路由 ```python from flask_login import logout_user @app.route('/logout') @login_required def logout(): logout_user() flash('Logged out successfully.') return redirect(url_for('login')) ``` 9. 运行应用程序 ```python if __name__ == '__main__': app.run(debug=True) ``` 以上是一个简单的示例,可以根据需要进行修改和扩展。同时,为了实现注册登录功能,我们还需要使用 Flask-Login 扩展来管理用户会话。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值