Python Flask 框架 操作 MySQL 数据库

实验前提:

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值