flask查询mysql数据展示_flask再学习-思考之怎么从数据库中查询数据在页面展示!...
看別人視頻覺得很簡單,要自己做蒙蔽了!這樣子。NO!
1. 流程:
首先要有和數(shù)據(jù)庫連接的驅(qū)動!一般有PYMySQL?mysqlclient 等
使用擴(kuò)展Flask-SQLAlchemy 獲得orm對象
重點在于ORM對象的使用:
http://www.pythondoc.com/flask-sqlalchemy/queries.html
2:使用 flask-sqlacodegen 擴(kuò)展 方便快速生成 ORM model
2.1 :pip install flask-sqlacodegen
2.2 使用方法
生成所有表的對象:
flask-sqlacodegen mysql://root:@127.0.0.1/food_db --outfile "common/models/model.py"? --flask
生成某個表的對象:
flask-sqlacodegen mysql://root:@127.0.0.1/food_db --tables user --outfile "common/models/user.py"? --flask
注意:在window下mysql的部分不要加 ‘ ’ ,在Mac環(huán)境下要加? ‘ ’
3: 修改自動生成的model中的db變量
from application import db
4:修改配置文件
SQLALCHEMY_DATABASE_URI = 'mysql://root:對應(yīng)root的密碼@127.0.0.1/food_db'
5:開始寫代碼了
【前言】
使用python處理mysql數(shù)據(jù)庫相關(guān)的業(yè)務(wù),一般都是使用庫MySQLdb直接調(diào)用sql語句。感覺很low,換一個SQLAlchemy上手。不但是耍酷,之前些flask代碼時就很驚訝基本看不到對數(shù)據(jù)庫的操作,其使用的就是修改過的SQLAlchemy,好處是直接操作數(shù)據(jù)庫表對象,即ORM對象關(guān)系映射管理,性能會慢些,但在1-2倍的時間,在可以接受的范圍。
安裝
pip install sqlalchemy
pip install --egg mysql-connector-python-rf
pip install sqlacodegen
生成models
方法一: 自己根據(jù)SQLAlchemy的docs寫model,比如一對多,多對一等復(fù)雜的表模型。(SQLAlchemy的文檔非常詳細(xì),就跟天書一樣,真心懶得看。還是flask-sqlalchemy的文檔簡潔明了,可以參考的)
方法二: 使用sqlacodegen從數(shù)據(jù)庫逆向出models.py
$ sqlacodegen --noviews --noconstraints --noindexes \
--outfile ./models.py mysql://username:password@localhost:3399/dbname
這里需要注意下,使用–noviews, –noconstraints, –noindexes,這3個選項是去掉視圖,約束和所以,基本用不到。反之,不去帶著些文件結(jié)構(gòu)的話可能會報錯,比如views找不到數(shù)據(jù)。
數(shù)據(jù)庫表-User
idnameage
1
‘Tom’
22
2
‘Jim’
21
3
‘Lucy’
22
對應(yīng)的models.py
# 導(dǎo)入:
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 創(chuàng)建對象的基類:
Base = declarative_base()
# 定義User對象:
class User(Base):
# 表的名字:
__tablename__ = 'user'
# 表的結(jié)構(gòu):
id = Column(String(20), primary_key=True)
name = Column(String(20))
基本使用
首先要創(chuàng)建engine,它代表一種數(shù)據(jù)庫連接資源。可以通過engine船艦connect和session完成事務(wù)的提交。對于使用os.fork或者multiprocessing的多進(jìn)程應(yīng)用來說,通常需要為紫禁城提供單獨的engine。
mysql:
engine = create_engine('mysql://scott:tiger@localhost/test')
#比較好的習(xí)慣是現(xiàn)實銷毀引擎,會有助于python的垃圾回收
engine.dispose()
sqlite:
engine = create_engine('sqlite:///file.db')
查詢記錄
那么我們怎么從數(shù)據(jù)庫中查詢數(shù)據(jù)?為此,SQLAlchemy 在您的 Model 類上提供了 query 屬性。當(dāng)您訪問它時,您會得到一個新的所有記錄的查詢對象。在使用 all() 或者 first() 發(fā)起查詢之前可以使用方法 filter() 來過濾記錄。如果您想要用主鍵查詢的話,也可以使用 get()。
connect:
connection = engine.connect()
result = connection.execute("select username from users")
for row in result:
print("username:", row['username'])
connection.close()
Session:
# 創(chuàng)建DBSession類型:
DBSession = sessionmaker(bind=engine)
# 創(chuàng)建Query查詢,filter是where條件,最后調(diào)用one()返回唯一行,如果調(diào)用all()則返回所有行:
user = session.query(User).filter(User.id=='5').one()
# 打印類型和對象的name屬性:
print 'type:', type(user)
print 'name:', user.name
# 關(guān)閉Session:
session.close()
使用更復(fù)雜的表達(dá)式查詢一些用戶:
>>> User.query.filter(User.email.endswith('@example.com')).all()
[, ]
按某種規(guī)則對用戶排序:
>>> User.query.order_by(User.username)
[, , ]
限制返回用戶的數(shù)量:
>>> User.query.limit(1).all()
[]
用主鍵查詢用戶:
>>> User.query.get(1)
打印查詢結(jié)果的全部元素:
for u in session.query(User).all():
print u.__dict__
插入記錄
插入記錄ret = session.add(),其中ret的值永遠(yuǎn)是none,不用看。
Session:
try:
sess = Session()
sess.add(User())
sess.commit()
except gevent.Timeout:
sess.invalidate()
raise
except:
sess.rollback()
raise
刪除記錄
刪除記錄是十分類似的,使用 delete() 代替 add():
>>> db.session.delete(me)
>>> db.session.commit()
更改記錄
基本思路是先filter到需要的行集合,再修改里面的值。這里有4種方式:
1) user.no_of_logins += 1
session.commit()
2) session.query().\
filter(User.username == form.username.data).\
update({"no_of_logins": (User.no_of_logins +1)})
session.commit()
3) conn = engine.connect()
stmt = User.update().\
values(User.no_of_logins = (User.no_of_logins + 1)).\
where(User.username == form.username.data)
conn.execute(stmt)
4) setattr(user, 'no_of_logins', user.no_of_logins+1)
session.commit()
事務(wù)
事物就是有一系列動作一氣呵成,如果中間失敗了,前面的動作不會生效。滿足ACID特性。
最簡單的例子就是轉(zhuǎn)賬,我給你轉(zhuǎn)10塊錢后臺需要做兩件事,先在我賬戶中減去10,再在你的賬戶里加10。想想如果這件事不用事務(wù)處理,我卡里減了10塊錢,而轉(zhuǎn)你錢沒有成功,這十塊錢就莫名消失了哈。
connection = engine.connect()
trans = connection.begin()
try:
r1 = connection.execute(table1.select())
connection.execute(table1.insert(), col1=7, col2='this is some data')
trans.commit()
except:
#一旦出錯就回滾
trans.rollback()
raise
connection.close()
參考文獻(xiàn)
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的flask查询mysql数据展示_flask再学习-思考之怎么从数据库中查询数据在页面展示!...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: robot连接mysql_robot连接
- 下一篇: mysql查询09软件技术1班_MySQ