日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

flask查询mysql数据展示_flask再学习-思考之怎么从数据库中查询数据在页面展示!...

發布時間:2024/1/23 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flask查询mysql数据展示_flask再学习-思考之怎么从数据库中查询数据在页面展示!... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看別人視頻覺得很簡單,要自己做蒙蔽了!這樣子。NO!

1. 流程:

首先要有和數據庫連接的驅動!一般有PYMySQL?mysqlclient 等

使用擴展Flask-SQLAlchemy 獲得orm對象

重點在于ORM對象的使用:

http://www.pythondoc.com/flask-sqlalchemy/queries.html

2:使用 flask-sqlacodegen 擴展 方便快速生成 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環境下要加? ‘ ’

3: 修改自動生成的model中的db變量

from application import db

4:修改配置文件

SQLALCHEMY_DATABASE_URI = 'mysql://root:對應root的密碼@127.0.0.1/food_db'

5:開始寫代碼了

【前言】

使用python處理mysql數據庫相關的業務,一般都是使用庫MySQLdb直接調用sql語句。感覺很low,換一個SQLAlchemy上手。不但是耍酷,之前些flask代碼時就很驚訝基本看不到對數據庫的操作,其使用的就是修改過的SQLAlchemy,好處是直接操作數據庫表對象,即ORM對象關系映射管理,性能會慢些,但在1-2倍的時間,在可以接受的范圍。

安裝

pip install sqlalchemy

pip install --egg mysql-connector-python-rf

pip install sqlacodegen

生成models

方法一: 自己根據SQLAlchemy的docs寫model,比如一對多,多對一等復雜的表模型。(SQLAlchemy的文檔非常詳細,就跟天書一樣,真心懶得看。還是flask-sqlalchemy的文檔簡潔明了,可以參考的)

方法二: 使用sqlacodegen從數據庫逆向出models.py

$ sqlacodegen --noviews --noconstraints --noindexes \

--outfile ./models.py mysql://username:password@localhost:3399/dbname

這里需要注意下,使用–noviews, –noconstraints, –noindexes,這3個選項是去掉視圖,約束和所以,基本用不到。反之,不去帶著些文件結構的話可能會報錯,比如views找不到數據。

數據庫表-User

idnameage

1

‘Tom’

22

2

‘Jim’

21

3

‘Lucy’

22

對應的models.py

# 導入:

from sqlalchemy import Column, String, create_engine

from sqlalchemy.orm import sessionmaker

from sqlalchemy.ext.declarative import declarative_base

# 創建對象的基類:

Base = declarative_base()

# 定義User對象:

class User(Base):

# 表的名字:

__tablename__ = 'user'

# 表的結構:

id = Column(String(20), primary_key=True)

name = Column(String(20))

基本使用

首先要創建engine,它代表一種數據庫連接資源。可以通過engine船艦connect和session完成事務的提交。對于使用os.fork或者multiprocessing的多進程應用來說,通常需要為紫禁城提供單獨的engine。

mysql:

engine = create_engine('mysql://scott:tiger@localhost/test')

#比較好的習慣是現實銷毀引擎,會有助于python的垃圾回收

engine.dispose()

sqlite:

engine = create_engine('sqlite:///file.db')

查詢記錄

那么我們怎么從數據庫中查詢數據?為此,SQLAlchemy 在您的 Model 類上提供了 query 屬性。當您訪問它時,您會得到一個新的所有記錄的查詢對象。在使用 all() 或者 first() 發起查詢之前可以使用方法 filter() 來過濾記錄。如果您想要用主鍵查詢的話,也可以使用 get()。

connect:

connection = engine.connect()

result = connection.execute("select username from users")

for row in result:

print("username:", row['username'])

connection.close()

Session:

# 創建DBSession類型:

DBSession = sessionmaker(bind=engine)

# 創建Query查詢,filter是where條件,最后調用one()返回唯一行,如果調用all()則返回所有行:

user = session.query(User).filter(User.id=='5').one()

# 打印類型和對象的name屬性:

print 'type:', type(user)

print 'name:', user.name

# 關閉Session:

session.close()

使用更復雜的表達式查詢一些用戶:

>>> User.query.filter(User.email.endswith('@example.com')).all()

[, ]

按某種規則對用戶排序:

>>> User.query.order_by(User.username)

[, , ]

限制返回用戶的數量:

>>> User.query.limit(1).all()

[]

用主鍵查詢用戶:

>>> User.query.get(1)

打印查詢結果的全部元素:

for u in session.query(User).all():

print u.__dict__

插入記錄

插入記錄ret = session.add(),其中ret的值永遠是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()

事務

事物就是有一系列動作一氣呵成,如果中間失敗了,前面的動作不會生效。滿足ACID特性。

最簡單的例子就是轉賬,我給你轉10塊錢后臺需要做兩件事,先在我賬戶中減去10,再在你的賬戶里加10。想想如果這件事不用事務處理,我卡里減了10塊錢,而轉你錢沒有成功,這十塊錢就莫名消失了哈。

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()

參考文獻

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的flask查询mysql数据展示_flask再学习-思考之怎么从数据库中查询数据在页面展示!...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。