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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

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

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

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

1. 流程:

首先要有和數(shù)據(jù)庫(kù)連接的驅(qū)動(dòng)!一般有PYMySQL?mysqlclient 等

使用擴(kuò)展Flask-SQLAlchemy 獲得orm對(duì)象

重點(diǎn)在于ORM對(duì)象的使用:

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

2:使用 flask-sqlacodegen 擴(kuò)展 方便快速生成 ORM model

2.1 :pip install flask-sqlacodegen

2.2 使用方法

生成所有表的對(duì)象:

flask-sqlacodegen mysql://root:@127.0.0.1/food_db --outfile "common/models/model.py"? --flask

生成某個(gè)表的對(duì)象:

flask-sqlacodegen mysql://root:@127.0.0.1/food_db --tables user --outfile "common/models/user.py"? --flask

注意:在window下mysql的部分不要加 ‘ ’ ,在Mac環(huán)境下要加? ‘ ’

3: 修改自動(dòng)生成的model中的db變量

from application import db

4:修改配置文件

SQLALCHEMY_DATABASE_URI = 'mysql://root:對(duì)應(yīng)root的密碼@127.0.0.1/food_db'

5:開始寫代碼了

【前言】

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

安裝

pip install sqlalchemy

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

pip install sqlacodegen

生成models

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

方法二: 使用sqlacodegen從數(shù)據(jù)庫(kù)逆向出models.py

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

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

這里需要注意下,使用–noviews, –noconstraints, –noindexes,這3個(gè)選項(xiàng)是去掉視圖,約束和所以,基本用不到。反之,不去帶著些文件結(jié)構(gòu)的話可能會(huì)報(bào)錯(cuò),比如views找不到數(shù)據(jù)。

數(shù)據(jù)庫(kù)表-User

idnameage

1

‘Tom’

22

2

‘Jim’

21

3

‘Lucy’

22

對(duì)應(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)建對(duì)象的基類:

Base = declarative_base()

# 定義User對(duì)象:

class User(Base):

# 表的名字:

__tablename__ = 'user'

# 表的結(jié)構(gòu):

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

name = Column(String(20))

基本使用

首先要?jiǎng)?chuàng)建engine,它代表一種數(shù)據(jù)庫(kù)連接資源。可以通過engine船艦connect和session完成事務(wù)的提交。對(duì)于使用os.fork或者multiprocessing的多進(jìn)程應(yīng)用來(lái)說,通常需要為紫禁城提供單獨(dú)的engine。

mysql:

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

#比較好的習(xí)慣是現(xiàn)實(shí)銷毀引擎,會(huì)有助于python的垃圾回收

engine.dispose()

sqlite:

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

查詢記錄

那么我們?cè)趺磸臄?shù)據(jù)庫(kù)中查詢數(shù)據(jù)?為此,SQLAlchemy 在您的 Model 類上提供了 query 屬性。當(dāng)您訪問它時(shí),您會(huì)得到一個(gè)新的所有記錄的查詢對(duì)象。在使用 all() 或者 first() 發(fā)起查詢之前可以使用方法 filter() 來(lái)過濾記錄。如果您想要用主鍵查詢的話,也可以使用 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()

# 打印類型和對(duì)象的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ī)則對(duì)用戶排序:

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

更改記錄

基本思路是先f(wàn)ilter到需要的行集合,再修改里面的值。這里有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ù)

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

最簡(jiǎn)單的例子就是轉(zhuǎn)賬,我給你轉(zhuǎn)10塊錢后臺(tái)需要做兩件事,先在我賬戶中減去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:

#一旦出錯(cuò)就回滾

trans.rollback()

raise

connection.close()

參考文獻(xiàn)

超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。