实验前提:
linux虚拟环境和连接pycharm操作以及mysql数据库安装部署已经完成
实验步骤:
1.安装flask模块
pip install flask
2.创建数据库
create database flask_machine_manager charset=utf8;
3.连接数据库
新建 test_flask_sqlalchemy.py 文件,并写入:
# 导入Flask模块
from flask import Flask
app = Flask(__name__)
## 连接数据库
# 连接mysql数据库需要导入pymysql模块
import pymysql
pymysql.install_as_MySQLdb()
# 导入SQLAlchemy扩展:通过python对象操作数据库
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
# 配置数据库的地址; 协议+用户名:密码@主机IP/数据库名称
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:westos@localhost/flask_machine_manager'
# 实时跟踪数据库的修改,不建议开启
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 定义Label数据库模型
class Label(db.Model):
# 定义表名
__tablename__ = 'bdp_label'
# 定义字段
# primary_key=True 声明主键 unique=True 值唯一 nullable=False 非空
# 默认主键(label_id)auto_increment 自增
label_id = db.Column(db.Integer, primary_key=True, nullable=False)
label_name = db.Column(db.String(16), nullable=False)
label_level = db.Column(db.Integer, nullable=False)
father_id = db.Column(db.Integer, nullable=False)
def __repr__(self):
return '<Label:%s %s %s %s>' % (
self.label_id, self.label_name, self.label_level, self.father_id)
4.启动程序并创建表
if __name__ == '__main__':
# 删除所有表
db.drop_all()
# 创建所有表
db.create_all()
app.run(host="0.0.0.0", port=8085, debug=True)
5.测试
在linux上执行, python + 文件名 执行文件
并在 flask_machine_manage 数据库里检查是否生成了 bdp_label 表

如何在命令行中操作数据库:
(venv) $ python test_flask_sqlalchemy.py shell
>>> from test_flask_sqlalchemy import *
# 增加
>>> role1 = Role(name='Admin')
>>> db.session.add(role1) #添加到数据库的session中
>>> db.session.commit() #提交数据库的修改(包括增、删、改)
>>> user1 = User(name='john', role_id=admin_role.id)
>>> db.session.add(user1)
>>> db.session.commit()
# 修改
>>> role1.role_name = 'Administrator'
>>> db.session.commit()
# 删除
>>> db.session.delete(user1)
>>> db.session.commit()
# 查询
>>> User.query.all() #查询所有用户数据
>>> User.query.count() #查询有多少个用户
>>> User.query.first() #查询第一个用户
>>> User.query.get(id='1') #查询id为1的用户(get的参数必须为主键)
>>> Role.query.filter_by(name='Administrator').all() #精确查询(查询角色名称为Administrator的所有数据)
>>> Role.query.filter(User.name=='Administrator').all()
query.filter_by 只有在你知道要查询的值时才工作
query.filter 可以接收任何Python的比较表达式
>>> from flask_sqlalchemy import SQLAlchemy
>>> from sqlalchemy import not_, or_
>>> user = User.query.filter(User.username.in_(['admin']), User.password==None).first()
>>> user = User.query.filter(not_(User.password == None)).first()
>>> user = User.query.filter(or_(not_(User.password==None),User.id>1)).first()
user = User.query.filter(not_(User.password == None)).first()
# 补充
>>> db.session.rollback() #数据库的回滚
>>> db.session.delete() #删除数据库
# 添加一个角色和两个用户
>>> role = Role(name='Admin')
>>> db.session.add(role)
>>> db.session.commit()
>>> user1 = User(name='tom', role_id=role.id)
>>> user2 = User(name='lilygg', role_id=role.id)
>>> db.session.add_all(user1,user2)
>>> db.session.commit()
# 实现关系引用查询
>>> role.users
>>> role.users.name
>>> user1.role
>>> user2.role.name
小案例:
from flask import Flask
app = Flask(__name__)
# 连接mysql数据库需要导入pymysql模块
import pymysql
pymysql.install_as_MySQLdb()
# SQLAlchemy扩展:通过python对象操作数据库
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
# 配置数据库的地址 协议:用户名:密码@主机IP/数据库名称
app.config['SQLALCHEMY_DATABASE_URI'] ='mysql://root:westos@localhost/flask_sql_demo'
# 实时跟踪数据库的修改,不建议开启
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
"""
两张表:
角色:Role roles表 角色ID 角色名称(管理员/普通用户)
用户:User users表 用户ID 用户名称 角色ID(外键)
"""
"""
通过users表查询用户的角色名称:1.通过users表查询role_id 2.通过roles表查询role_name
添加数据库模型之间的关联 可以实现 一步直接查询 (需要在users表中添加role属性,在roles表中添加users属性)
注意:这些属性仅仅是为了方便查询,且不能出现在数据库字段中
"""
# 数据库模型 继承db.Model
class Role(db.Model):
# 定义表名
__tablename__ = 'roles'
# 定义字段 primary_key=True 声名主键 unique=True 值唯一
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
# 一对多关系 (一个用户对应一个角色,一个角色可以对应多个用户)
# 在对应关系为一的一方,写关联
# relationship 表示和User模型发生了关联,增加了一个users属性
# backref 表示role是User模型需要增加的属性
users = db.relationship('User', backref='role')
# __repr__方法 显示一个可读字符串
def __repr__(self):
return '<Role: %s %s>' % (self.id,self.name)
class User(db.Model):
# 定义表名
__tablename__ = 'users'
# 定义字段 primary_key=True 声名主键 unique=True 值唯一
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
email = db.Column(db.String(32), unique=True)
passwd = db.Column(db.String(32))
# db.ForeignKey() 声明外键
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
# User希望添加role属性,但这个属性需要在另一个模型中定义
# __repr__方法 显示一个可读字符串
def __repr__(self):
return '<User: %s %s %s %s %s>' % (self.id, self.name, self.email, self.passwd,self.role_id)
from flask_script import Shell,Manager
manager = Manager(app)
def make_shell_context():
return dict(app=app, db=db, User=User, Role=Role)
manager.add_command("shell", Shell(make_context=make_shell_context))
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
# 删除表
db.drop_all()
# 创建表
db.create_all()
# 增加数据 (添加2个角色和3个用户)
# 一次插入一条数据
ro1 = Role(name='admin')
db.session.add(ro1)
db.session.commit()
ro2 = Role(name='user')
db.session.add(ro2)
db.session.commit()
# 一次插入多条数据
us1 = User(name='john', email='john@163.com', passwd='123', role_id=ro1.id)
us2 = User(name='toms', email='toms@163.com', passwd='234', role_id=ro1.id)
us3 = User(name='lily', email='lily@163.com', passwd='456', role_id=ro2.id)
db.session.add_all([us1,us2,us3])
db.session.commit()
app.run(host="192.168.56.20",debug=True)
589

被折叠的 条评论
为什么被折叠?



