Python-Web框架之 - 利用SQLALchemy创建与数据库MySQL的连接, 详解用Flask时会遇到的一些大坑 !...

经过这个小项目算是对Django与Flask这两个web框架有了新的认识 , Django本身的轮子非常齐全 , 套路也很固定 , 新手在接触Django框架时 , 不会陷入到处找轮子的大坑 ;

那么在使用Flask这个框架的时候会碰到哪些大坑呢 , 首先Flask是一个轻量级的web框架 , 之所以说它轻量级是因为它本身并没有多少轮子 , 那是不是就代表这些轮子需要我们自己来造呢 , 那倒不必 , 但是需要我们去找这些轮子 , 这恰恰是锻炼你的思维的时候 , 你要找轮子之前 , 你必须得知道需要哪些轮子 , 这些轮子起到什么作用 , 知道了这些之后 , 进行下一步 ;

重点来了 , 这里所说的轮子到底是指什么呢 , 为什么说它坑呢 , Flask这个框架的文档和资料远没有Django那么丰富和清晰 , 你可能在网上能找到一些看似是你需要的资料 , 但是它很有可能里面用到的模块、驱动会有各种版本不一致的大坑 , 从东拼西凑来的轮子弄到一起可能会出现各种报错 , 这个时候你就得一个报错一个报错的解决 , 去查这个报错的原因 , 去查东拼西凑的模块的文档说明 , 这里要用到的MySQL驱动就有很多种版本 , PyMySQL、MySQLdb、mysql-connector、mysql-connector-python , 如果你选择MySQLdb , 那恭喜你这个是python2.x的版本 , 如果你选择了mysql-connector-python , 那又要恭喜你 ,这个只支持到python3.4 哈哈 , 如果选择PyMySQL , 虽然程序可以运行 , 但是会有各种警告之类的长串的红色字体 , 看着就很烦 , 经过实测选择mysql-connector不会有什么问题 ;

另外 , 还有一些使用数据库增删改查语句的坑 , 数据库语句可不像python语句那么干净 , 有些语句末尾要加分号 , 有些末尾又不需要加 , 有时候甚至还有对象单数和复数的区别 , 稍不留神儿你的语句就没效果或者报错 .

最后直接上源码和一些笔记吧...

# coding=utf-8
from flask import Flask
# SQLALchemy可以理解为python和数据库之间关联的工具
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
# 配置数据库的地址URI , 格式 "数据库类型+数据库驱动名称://用户名:密码@机器地址:端口号/数据库名"  , 端口号可以不写.
# python3中用的mysql驱动是mysql-connector , 已经不支持python2的MySQLdb驱动.
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+mysqlconnector://root:password@127.0.0.1/sql_demo"
# 跟踪数据库的修改 --> 不建议开启 , 一是消耗性能 , 二是未来的版本中会移除.
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# 将app作为参数传入这个关联工具 , 创建一个两者相关联对象db
db = SQLAlchemy(app)


# 创建数据库的模型 , 需要继承db.Model模型
class Role(db.Model):
    """创建角色类"""
    # 定义表名
    __tablename__ = "roles"
    # 定义字段
    # db.Column表示是一个字段 , db.Integer就代表id这个字段的数据类型是整数 , primary_key代表主键 , 是作为表的行的唯一标识.
    # db.String代表是字符串类型 , 字符串长度定义个n个字节 , unique(唯一的) , unique=True代表这列不允许出现重复的值
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(100),unique=True)
    # 在"一对多"的一中定义users_role属性 , 该属性不会出现在字段中 , 后面的backref="role"是给User反向引用的
    # 由于是"一对多" , 所以"多"的地方用User参数 , "一"的地方用不加s的实例对象参数role
    users_role = db.relationship("User",backref="role")
    def __repr__(self):
        """返回定制对象输出信息 , 与__str__作用类似"""
        return "Role:%d  %s"%(self.id,self.name)


class User(db.Model):
    """创建用户类"""
    __tablename__ = "users"
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(100),unique=True)
    password = db.Column(db.String(100))              # 每个人的密码不要求不同 , 可以不用指定unique=True
    email = db.Column(db.String(100),unique=True)
    role_id = db.Column(db.Integer,db.ForeignKey("roles.id"))        # db.ForeignKey定义外键 , 参数是 表名.id
    def __repr__(self):
        """返回定制对象输出信息 , 与__str__作用类似"""
        return "User:%d %s %s %s"%(self.id,self.name,self.password,self.email)


# 定义创建role和user实例对象的函数.
def role_user_make():
    role1 = Role(name="admin")
    role2 = Role(name="user")
    db.session.add_all([role1,role2])
    db.session.commit()
    user1 = User(name="Tom", password="XYZ456", email="tom@163.com", role_id=role1.id)
    user2 = User(name="Jack", password="CB_4321", email="jack@163.com", role_id=role2.id)
    user3 = User(name="Alan", password="Zj@321", email="alan@163.com", role_id=role2.id)
    user4 = User(name="Mark", password="111222", email="mark@163.com", role_id=role2.id)
    db.session.add_all([user1,user2,user3,user4])
    db.session.commit()


@app.route("/")
def index():
    return "hello world"


if __name__ == '__main__':
    # 删除表 , 在创建表之前先删除表
    db.drop_all()
    # 创建表
    db.create_all()
    role_user_make()
    app.run(debug=True)

 

转载于:https://www.cnblogs.com/chenbin93/p/8988688.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值