Flask 连接MySQL数据库的方法
Method 1:pymsql
通过MySQL-Python对数据库的增、删、改、查等操作,都是要先建立connection连接对象,然后获取cursor, 最后需要关闭cursor 对象和conneciton 连接。
在程序中使用cursor.execute()方法来执行相关更新数据的操作,如果没有出现异常,则使用conn.commit方法提交事务,让数据真正生效。如果出现异常,则需要使用conn.rollback()方法回滚事务。
from flask import Flaskimport pymysqlapp = Flask(__name__)# 连接本地Mysql数据库conn = pymysql.connect(host='localhost',port=3306,user='root', # 用户名password='root', # 密码database='wuao', # 数据库的名字charset='utf8')cursor = conn.cursor() # 获取游标# 注:user为表名try:# 增:sql = "insert into user(uid,username,password,email) values ('1','hanhan','123456','[email protected]')"# 改:# sql = "update user set password='654321' where name='hanhan'"# 删:# sql = "delete from user where username='hanhan'"cursor.execute(sql) # 执行单条SQL语句conn.commit() #提交事务# 这个时候我们会发现,双引号内都是sql语句,其余功能我就不多写了,# 会sql语句的朋友可以轻轻松松的使用这种方法,对你的数据库进行任何操作sql = "select *from user" # 全连接的SQL语句,要查询user表中所有的数据cursor.execute(sql) # 执行单条SQL语句results = cursor.fetchall() # 接受全部的返回结果行print(results)except Exception as e: # 抛出异常print(e)conn.rollback() # 事务回滚,如果产生异常,退回到执行sql语句之前cursor.close() # 关闭游标conn.close() # 关闭数据库游标def conn():r=results#将数据库信息显示在前端return str(r)if __name__ == '__main__':app.run(debug=True)COPY
Method 2:SQLAlchemy
SQLAlchemy是一个基于Python实现的 ORM ( Object Relational Mapping , 对象关系映射 ) 框架,建立在 DB API 之上,使用 ORM 进行数据库操作。
Flask-SQLAlchemy 这个 ORM 框架使我们操作数据库变成了操作对象,一个表被抽象成了一个类,一个表中的字段被抽象成一个类的多个属性,一条数据就抽象成该列的一个对象,不用再写烦琐的底层 SQL 语句了。
from flask import Flaskimport pymysqlfrom flask_migrate import Migratefrom flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)app.config['SECRET_KEY'] = '123'#依次对应的是用户名 密码 数据库名称app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@localhost/yiban'#动态追踪修改设置,如未设置只会提示警告app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True#查询时会显示原始SQL语句app.config['SQLALCHEMY_ECHO'] = True# 初始化一个对象db = SQLAlchemy(app)# 测试数据库是否连接成功# db.create_all()pymysql.install_as_MySQLdb()migrate = Migrate(app, db)# db.init_app(app) #初始化数据库接受文件pymysql.install_as_MySQLdb()class User(db.Model): #创建一个User类__tablename__ = 'user' #表名id = db.Column(db.Integer, primary_key=True,autoincrement=True,default=1)#整型,主键,自增长,默认值为1username = db.Column(db.String(50), nullable=False)# 用户名不能为空password = db.Column(db.String(50), nullable=False)# 密码不能为空# db.create_all() #创建表,对象映射,在增删改查时可去掉# 增:user1=User(id=1,username='hanhan',password='123456')db.session.add(user1) #将user1加入数据库# 查:# 一条:user1=User.query.filter_by(id=1).first() #方法1# user1=User.query.filter(User.id==1).first() #方法2print(user1.username) #查找id=1的对象,输出它的用户名# 一种:result=User.query.filter_by(password='123456').all() #方法1# result=User.query.filter(User.password=='123456').all() #方法2for i in result:print(i.username) #查找password为123456的所有对象,输出它们的名字# 改:#以查为前提user1.username='han++' #将 user1 的 username 由 hanhan 变为 han++# 删:#以查为前提# db.session.delete(user1) #删除对象user1db.session.commit() #提交事务if __name__ == '__main__':app.run(debug=True)
COPY
Flask-SQLAlchemy 常用数据类型
| 类型名称 | Python 类型 | 描述 |
|---|---|---|
| Integer | int | 整型,通常为32位,映射到数据库中是 int 类型 |
| SmallInteger | int | 短整型,通常为16位,映射到数据库中是 int 型 |
| BigInteger | int 或 long | 整型,精度不受限制,映射到数据库中是 int 型 |
| Float | float | 浮点数,映射到数据库中是 float 类型 |
| Numeric | decimal | 定点数 |
| String | str | 可变长度字符串,映射到数据库中是 varchar 整型 |
| Text | str | 可变长度字符串,适合大量文本 |
| Unicode | unicode | 可变长度 Unicod e字符串 |
| Boolean | bool | 布尔值,映射到数据库中是 tinyint 类型 |
| Date | datetime.date | 日期类型 |
| Time | datatime.time | 时间类型 |
| Datatime | datatime.datatime | 时间间隔 |
| Enum | str | 字符列表 |
| PickleType | 任意 Python 对象 | 实现 Pickle 序列化 |
| LargeBinary | str | 二进制 |
Flask-SQLAlchemy 声明可选参数
| 可选参数 | 描述 |
|---|---|
| Primary_key | 如果设置为 True,该列为表的主键 |
| unique | 如果设置为 True,该列不允许有相同值 |
| index | 如果设置为 True,为提高查询效率,为该列创建索引 |
| nullable | 如果设置为 True,该列允许为空。设置为 False,该列不允许为空值 |
| default | 定义该列的默认值 |
