Flask-sqlalchemy - 读MySQL案例
初次学习 Flask 框架时,检索相关操作或者示例代码,网上90%的博客文章清一色的抄官方示例,并没有实际的帮助到我。所以在此记录下一些主要的操作与示例,也希望可以帮助到初学者。
所用数据库 takeout 其表为
mysql> show tables ;
+----------------------------+
| Tables_in_takeout |
+----------------------------+
| distribution_operation |
| distribution_platform |
| distribution_platform_data |
| order_data |
| other_store_data |
| store_basic_informations |
| store_operation_data |
+----------------------------+
初始化
from flask import Flask , render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:root@localhost/takeout"
db = SQLAlchemy(app)
@app.route("/")
def index() :
return "hello"
if __name__ == "__main__" :
app.run( host="0.0.0.0" , debug=True )
读取方法一 : 使用SQL语句
这种方法最为简单,方便 ,只需调用
db.session.execute( " SQL语句 " ) 即可。
在index函数中加入以下语句
result = db.session.execute( "show tables" )
print( result )
输出 :
<sqlalchemy.engine.cursor.CursorResult object at 0x00000255115F3FD0>
一个sqlalchemy对象,它还没实际的对 MySQL 进行操作,这个对象中有一个 all() 函数成员,可以把它理解为一个触发器,调用它时,就会实际的对数据库进行连接
print( result.all() )
输出 :
[('distribution_operation',), ('distribution_platform',), ('distribution_platform_data',), ('order_data',), ('other_store_data',), ('store_basic_informations',), ('store_operation_data',)]
就如输出一样,返回了正确的结果
读取方法二 : 使用Model类提供的方法
这种方法在构建期间比较麻烦,相对的,提供更好的操作。
此方法在读取库中的某个表之后,会将这个表装入一个类,这个类的类名要和要读取的表的名字相同,其属性也要和表中的字段一致,但是,并不是要声明全部字段。例如,表 order_data 的结构如下
mysql> show columns from order_data ;
+-----------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| restaurant_inside_id | varchar(255) | YES | | NULL | |
| 该订单整体时效 | varchar(255) | YES | | NULL | |
| 该订单接单时效 | varchar(255) | YES | | NULL | |
| 该订单到店时效 | varchar(255) | YES | | NULL | |
| 该订单取餐时效 | varchar(255) | YES | | NULL | |
| 该订单送达时效 | varchar(255) | YES | | NULL | |
| 该订单评价 | varchar(255) | YES | | NULL | |
+-----------------------+--------------+------+-----+---------+----------------+
我要读取这个表的十个 id ,需要构建同名的类 , 此类需要继承一个数据库的基类,并且使用 db.session.query() 而不是 db.session.execute()
class order_data( db.Model ) :
id = db.Column( db.Integer , primary_key=True )
@app.route("/")
def index() :
result = db.session.query( order_data.id ).limit(10).all()
print( result )
return "hello"
输出 :
[(10,), (11,), (12,), (13,), (14,), (15,), (16,), (17,), (18,), (19,)]
如上,这里只用到了 id 字段 ,那么在类中只声明 id 字段即可 ,如果你好奇,把不带“触发器all()”的 result 输出 , 将会得到以下输出
SELECT order_data.id AS order_data_id
FROM order_data
LIMIT %s
这种方法读取数据库之后,Flask-sqlalchemy 会把这些数据放入对应的类中,且提供了一些好用的方法,这是优点 。既然会将数据放入对应的类中,那么类对应的属性和类型,要和表中的字段及类型相同 , 而且,类名也要和表名相同 , 看完上面的输出就可以理解了 。