自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

盤點(diǎn)Flask與數(shù)據(jù)庫(kù)的交互插件--Flask-Sqlalchemy

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維
在我們做web開發(fā)的時(shí)候,經(jīng)常需要用到與數(shù)據(jù)庫(kù)交互,因?yàn)槲覀兊臄?shù)據(jù)通常都是保存在數(shù)據(jù)庫(kù)中的,如果有人需要訪問,就必須與數(shù)據(jù)庫(kù)訪問,所以今天我們介紹一個(gè)Flask中與數(shù)據(jù)庫(kù)交互的插件---Flask-Sqlalchemy。

[[418400]]

大家好,我是Python進(jìn)階者。

前言

在我們做web開發(fā)的時(shí)候,經(jīng)常需要用到與數(shù)據(jù)庫(kù)交互,因?yàn)槲覀兊臄?shù)據(jù)通常都是保存在數(shù)據(jù)庫(kù)中的,如果有人需要訪問,就必須與數(shù)據(jù)庫(kù)訪問,所以今天我們介紹一個(gè)Flask中與數(shù)據(jù)庫(kù)交互的插件---Flask-Sqlalchemy。

一、安裝并導(dǎo)入

  1. pip install flask-sqlalchemy 
  2.  
  3. from flask_sqlalchemy import SQLAlchemy 
  4. import os 
  5. import pymysql as p 
  6. from flask import Flask 

二、基本用法

今天我們要了解的是Mysql數(shù)據(jù)庫(kù),所以這里重點(diǎn)介紹連接Mysql數(shù)據(jù)庫(kù)的方法。

1.連接數(shù)據(jù)庫(kù)

1).寫在配置文件中然后讀取

首先創(chuàng)建一個(gè)配置文件"config.py",內(nèi)容為:

  1. db_type='mysql' 
  2. db_conn='pymysql' 
  3. host='127.0.0.1' 
  4. username='root' 
  5. password='123456' 
  6. port='3306' 
  7. db_name='people' 
  8. SQLALCHEMY_DATABASE_URI='{}+{}://{}:{}@{}:{}/{}?charset=utf8'.format(db_type,db_conn,username,password,host,port,db_name) 
  9. SQLALCHEMY_COMMIT_ON_TEARDOWN=False 
  10. SQLALCHEMY_TRACK_MODIFICATIONS=True 

然后在應(yīng)用中導(dǎo)入配置文件:

  1. from flask_sqlalchemy import SQLAlchemy 
  2. from flask import Flask 
  3. import config 
  4. app=Flask(__name__) 
  5. app.config.from_object(config) # 連接數(shù)據(jù)庫(kù)配置文件 
  6. db=SQLAlchemy(app) 
  7. db.create_all()  # 創(chuàng)建所有的數(shù)據(jù)庫(kù) 

2).直接寫在應(yīng)用中讀取

  1. app=Flask(__name__) 
  2. p.install_as_MySQLdb()   # mysql連接器,因?yàn)椴恢С謕y3版本,所以必須加上這行 
  3. app.config['SECRET_KEY']=os.urandom(50) 
  4. app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@127.0.0.1:3306/people' 
  5. app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True   # 每次請(qǐng)求結(jié)束后都會(huì)自動(dòng)提交數(shù)據(jù)庫(kù)中的變動(dòng) 
  6. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True  # 動(dòng)態(tài)追蹤修改設(shè)置,如未設(shè)置只會(huì)提示警告 
  7. db = SQLAlchemy(app) 

還有許多其它的配置參數(shù),比如:

  1. SQLALCHEMY_NATIVE_UNICODE    # 可以用于顯式禁用原生 unicode 支持 
  2. SQLALCHEMY_POOL_SIZE         # 數(shù)據(jù)庫(kù)連接池的大小,默認(rèn)是引擎默認(rèn)值(5)  
  3. SQLALCHEMY_POOL_TIMEOUT      # 設(shè)定連接池的連接超時(shí)時(shí)間,默認(rèn)是 10 
  4. SQLALCHEMY_POOL_RECYCLE      # 多少秒后自動(dòng)回收連接,mysql默認(rèn)為2小時(shí) 
  5. SQLALCHEMY_RECORD_QUERIES    # 可以用于顯式地禁用或啟用查詢記錄 
  6. SQLALCHEMY_ECHO              # 為Ture時(shí)用于調(diào)試,顯示錯(cuò)誤信息 
  7. SQLALCHEMY_BINDS             # 一個(gè)映射 binds 到連接 URI 的字典 

3).使用獨(dú)特的創(chuàng)建引擎

  1. from sqlalchemy import create_engine 
  2. # echo參數(shù)為True時(shí),會(huì)顯示每條執(zhí)行的SQL語(yǔ)句,為False時(shí)關(guān)閉 
  3. engine = create_engine('mysql+pymysql://root:123456@127.0.0.1:3306/people',echo=True
  4. engine.connect() 

這樣我們就算與People數(shù)據(jù)庫(kù)建立連接了,接下來我們來建立一張表。

4).創(chuàng)建連接多個(gè)數(shù)據(jù)庫(kù)

  1. app.config['SQLALCHEMY_BINDS']={ 
  2. 'users'"mysql+pymysql://root:123456@127.0.0.1:3306/user"
  3.     'admin''sqlite://C:/Users/Administrator/Desktop/admin'
  4.     'buy':   'postgresql://root:123321@127.0.0.1/buy' 

然后引用表:

  1. db.create_all(bind=['users']) 
  2. db.create_all(bind='admin'

指定Users數(shù)據(jù)庫(kù)中的表:

  1. __bind_key__ = 'users' 
  2. bind key 內(nèi)部存儲(chǔ)在表的 info 字典中  即:info={'bind_key''users'

2.建立數(shù)據(jù)表并插入值

1).繼承"db.Model"類

  1. from flask_sqlalchemy import SQLAlchemy 
  2. from flask import Flask 
  3. import config 
  4. app=Flask(__name__) 
  5. app.config.from_object(config) # 添加配置文件 
  6. db=SQLAlchemy(app) 
  7. class User(db.Model): 
  8.     __tablename__='users' 
  9.     id=db.Column(db.Integer, primary_key=True,autoincrement=True) # 整數(shù)類型的自增主鍵 
  10.     username=db.Column(db.String(100),nullable=False)  # 字符類型不為空 
  11.     password=db.Column(db.String(100),nullable=False)  # 字符類型不為空 
  12.  
  13.     def __init__(self,username,password): 
  14.         self.username=username 
  15.         self.password=password 
  16.  
  17.     def __repr__(self): 
  18.         # 打印當(dāng)前類名和它的實(shí)例化后的值 
  19.         return ' %s is %r' %(self.__class__.__name__,self.username)  
  20.      
  21.      
  22. # 請(qǐng)求鉤子,第一次請(qǐng)求之前執(zhí)行 
  23. @app.before_first_request 
  24. def create_table():  
  25.     db.drop_all()  # 刪除所有表 
  26.     db.create_all() # 創(chuàng)建新的表 
  27.  
  28.      
  29. @app.route('/'
  30. def create(): 
  31.     use1= User('hwhrr''123321')   
  32.     use2= User('hwzjj''123456'
  33.     use3= User('hwzzz''654321'
  34.     db.session.add_all([use1,use2,use3]) # 添加所有的用戶,添加一個(gè)用戶去掉_all后面加一個(gè)元祖即可  
  35.     db.session.commit()  # 提交數(shù)據(jù) 
  36.     return use1.__repr__() # 返回用戶1的值 
  37.  
  38. if __name__ == '__main__':   
  39.     app.run(debug=True

  1. Column        參數(shù)列表   
  2. name          列名 
  3. type_         類型 
  4. *args         列表參數(shù) 
  5. Constraint(約束), ForeignKey(外鍵), ColumnDefault(默認(rèn)), Sequenceobjects(序列)定義 
  6. key         列名的別名 
  7. primary_key 如果為True,則是主鍵 
  8. nullable    如果是True,則可以為null 
  9. default     設(shè)置默認(rèn)值,默認(rèn)是None 
  10. index       是否是索引,默認(rèn)是True 
  11. unique      是否唯一鍵,默認(rèn)是False 
  12. onupdate    指定一個(gè)更新時(shí)候的值 
  13. autoincrement 設(shè)置為整型自動(dòng)增長(zhǎng) 
  14. quote         如果列明是關(guān)鍵字,則強(qiáng)制轉(zhuǎn)義,默認(rèn)False 

2).利用原始引擎來創(chuàng)建會(huì)話(稍微復(fù)雜點(diǎn))

  1. from flask import Flask 
  2. from sqlalchemy import create_engine 
  3. from sqlalchemy.orm import sessionmaker 
  4. from sqlalchemy.ext.declarative import declarative_base 
  5. from sqlalchemy import ColumnInteger, String 
  6. app=Flask(__name__) 
  7. Base = declarative_base() 
  8. # 創(chuàng)建連接數(shù)據(jù)庫(kù)的引擎并且打開回顯 
  9. engine = create_engine("mysql+pymysql://root:123456@localhost/people",echo=True
  10. Session = sessionmaker(bind=engine) # 創(chuàng)建會(huì)話標(biāo)記 
  11. class User(Base): 
  12.     __tablename__ = 'article' 
  13.     id = Column(Integer, primary_key=True,autoincrement=True
  14.     username = Column(String(100),nullable=False
  15.     password = Column(String(100),nullable=False
  16.     def __init__(self, username,password): 
  17.         self.username = username 
  18.         self.password=password 
  19.     def __repr__(self): 
  20.         return ' %s is %r' %(self.__class__.__name__,self.username) 
  21.      
  22. @app.before_first_request 
  23. def create_table(): 
  24.     Base.metadata.drop_all(engine) # 刪除所有數(shù)據(jù)庫(kù) 
  25.     Base.metadata.create_all(engine) # 創(chuàng)建所有數(shù)據(jù)庫(kù) 
  26.      
  27. @app.route('/'
  28. def index(): 
  29.     userUser("hwhrr","123321"
  30.     session = Session()   # 創(chuàng)建會(huì)話 
  31.     session.add(user)  # 添加內(nèi)容 
  32.     session.commit()  # 提交 
  33.     return user.__repr__() 
  34.  
  35. if __name__ == '__main__':   
  36.     app.run(debug=True

3.數(shù)據(jù)庫(kù)之間的關(guān)系

1). 一對(duì)一

只需讓兩張表都在同等的位置上,屬于雙向關(guān)系。

  1. class father(db.Model): 
  2.     __tablename__='Father' 
  3.     id=db.Column(db.Integer, primary_key=True,autoincrement=True
  4.     name= db.Column(db.String(100),nullable=False
  5.     age= db.Column(db.Integer,nullable=False
  6.     #主要是要在一個(gè)表上設(shè)置uselist 然后設(shè)置back_populates的值為其它表的映射返回值 
  7.     son_fa=db.relationship('son',uselist=False, back_populates='fa_son')  
  8.     def __init__(self,name,age): 
  9.         self.name=name 
  10.         self.age=age 
  11.     def __repr__(self): 
  12.         return '%s is %r'%(self.__class__.__name__,self.name
  13.  
  14.  
  15. class son(db.Model): 
  16.     __tablename__='Son' 
  17.     id=db.Column(db.Integer, primary_key=True,autoincrement=True
  18.     name= db.Column(db.String(100),nullable=False
  19.     age= db.Column(db.Integer,nullable=False
  20.     # 這里無需設(shè)置uselist 
  21.     fa_son=db.relationship('father',back_populates='son_fa'
  22.     def __init__(self,name,age): 
  23.         self.name=name 
  24.         self.age=age 
  25.     def __repr__(self): 
  26.         return '%s is %r'%(self.__class__.__name__,self.name

2).一對(duì)多

我們需要建立一個(gè)主表和一個(gè)子表,分別命名為“father”和‘son’,然后需要建立外鍵和反射來互相引用建立一種關(guān)系,我們來看看:

  1. class father(db.Model): 
  2.     __tablename__='Father' 
  3.     id=db.Column(db.Integer, primary_key=True,autoincrement=True
  4.     name= db.Column(db.String(100),nullable=False
  5.     age= db.Column(db.Integer,nullable=False
  6.     # 表示另一端是son這個(gè)模型,backref可替代Father.id訪問father模型 
  7.     son_fa=db.relationship('son',backref='fa',lazy='dynamic'
  8.     # lazy表示加載方式: 
  9.     # dynamic:動(dòng)態(tài)加載,只有用到了才加載 只可以用在一對(duì)多和多對(duì)多關(guān)系中 
  10.     # subquery:全部加載 
  11.     def __init__(self,name,age): 
  12.         self.name=name 
  13.         self.age=age 
  14.     def __repr__(self): 
  15.         return '%s is %r'%(self.__class__.__name__,self.name
  16.  
  17.  
  18. class son(db.Model): 
  19.     __tablename__='Son' 
  20.     id=db.Column(db.Integer, primary_key=True,autoincrement=True
  21.     name= db.Column(db.String(100),nullable=False
  22.     age= db.Column(db.Integer,nullable=False
  23.     f_id=db.Column(db.Integer,db.ForeignKey('Father.id')) # 建立外鍵關(guān)聯(lián),指明表名和字段 
  24.     def __init__(self,name,age): 
  25.         self.name=name 
  26.         self.age=age         
  27.     def __repr__(self): 
  28.         return '%s is %r'%(self._class__.__name__,self.name
  29.  
  30. @app.route('/'
  31. def create(): 
  32.     use1= father('hw', 45) 
  33.     use2= son('hyy', 20) 
  34.     db.session.add_all([use1,use2]) 
  35.     db.session.commit() 
  36.     return use1.__repr__()+'\n'+use2.__repr__() 

3).多對(duì)一

就是將反射應(yīng)用在子表上,與父表同時(shí)進(jìn)行關(guān)聯(lián)。

  1. class father(db.Model): 
  2.     __tablename__='Father' 
  3.     id=db.Column(db.Integer, primary_key=True,autoincrement=True
  4.     name= db.Column(db.String(100),nullable=False
  5.     age= db.Column(db.Integer,nullable=False
  6.     # 表示另一端是son這個(gè)模型 
  7.     son_fa=db.relationship('son', back_populates="fath")  
  8.     def __init__(self,name,age): 
  9.         self.name=name 
  10.         self.age=age 
  11.     def __repr__(self): 
  12.         return '%s is %r'%(self.__class__.__name__,self.name
  13.  
  14.  
  15. class son(db.Model): 
  16.     __tablename__='Son' 
  17.     id=db.Column(db.Integer, primary_key=True,autoincrement=True
  18.     name= db.Column(db.String(100),nullable=False
  19.     age= db.Column(db.Integer,nullable=False
  20.     f_id=db.Column(db.Integer,db.ForeignKey('Father.id')) # 建立外鍵關(guān)聯(lián) 
  21.     # 表示另一端是father這個(gè)模型 
  22.     fa_son=db.relationship('father',back_populates="so")  
  23.     def __init__(self,name,age): 
  24.         self.name=name 
  25.         self.age=age 
  26.     def __repr__(self): 
  27.         return '%s is %r'%(self.__class__.__name__,self.name

4).多對(duì)多

設(shè)置一個(gè)關(guān)聯(lián)表來對(duì)兩個(gè)表同時(shí)進(jìn)行管理。

  1. # 設(shè)置關(guān)聯(lián)表 
  2. gl=db.Table('glb'
  3.     db.Column('id',db.Integer,primary_key=True,autoincrement=True), 
  4.     db.Column('son_id',db.Integer,db.ForeignKey('Son.id')), 
  5.     db.Column('father_id',db.Integer,db.ForeignKey('Father.id')) 
  6.  
  7. # 父表 
  8. class father(db.Model): 
  9.     __tablename__='Father' 
  10.     id=db.Column(db.Integer, primary_key=True,autoincrement=True
  11.     name= db.Column(db.String(100),nullable=False
  12.     age= db.Column(db.Integer,nullable=False
  13.     # 設(shè)置關(guān)聯(lián)表 動(dòng)態(tài)加載 
  14.     son_fa=db.relationship('son',secondary=gl,backref="fas",lazy="dynamic"
  15.     def __init__(self,name,age): 
  16.         self.name=name 
  17.         self.age=age 
  18.     def __repr__(self): 
  19.         return '%s is %r'%(self.__class__.__name__,self.name
  20.  
  21. # 子表 
  22. class son(db.Model): 
  23.     __tablename__='Son' 
  24.     id=db.Column(db.Integer, primary_key=True,autoincrement=True
  25.     name= db.Column(db.String(100),nullable=False
  26.     age= db.Column(db.Integer,nullable=False
  27.     def __init__(self,name,age): 
  28.         self.name=name 
  29.         self.age=age 
  30.     def __repr__(self): 
  31.         return '%s is %r'%(self.__class__.__name__,self.name

可以看出我們已經(jīng)創(chuàng)建出了一張關(guān)聯(lián)表,名字就是我們?cè)O(shè)置的“glb”。

4.查看數(shù)據(jù)

1).查看全部數(shù)據(jù)(all)

  1. father.query.all() 

2).精準(zhǔn)查詢(filter_by)

  1. father.query.filter_by(name='hw').all()  # 查找所有名字為hw的記錄 

3).模糊查詢(filter)

  1. father.query.filter(father.name.startswith('h').all() # 查找所有名字首字母為h的記錄 

4).主鍵查詢(get)

  1. father.query.get(1) # 查看id為1的記錄 

5).取反操作(not_)

  1. from sqlalchemy import not_ 
  2. father.query.filter(not_(father.name=='hw')).all() # 查找所有除了名字不是hw的記錄 

6).與操作(and_)

  1. from sqlalchemy import and_ 
  2. # 查找名字末尾是h并且年齡等于50的記錄 
  3. father.query.filter(and_(father.name.endswith('h'),father.age==50)).all() 

7).或操作(or_)

  1. from sqlalchemy import or_ 
  2. # 查找名字末尾是h或者年齡等于50的記錄 
  3. father.query.filter(or_(father.name.endswith('h'),father.age==50)).all() 

8).一對(duì)多正向查詢

  1. son.query.filter_by(f_id=2).all() 

9).一對(duì)多反向查詢

  1. son.query.filter_by(fa=use1).all() 

10).查詢第一個(gè)出現(xiàn)的數(shù)據(jù)

  1. son.query.filter(son.age==10).first() 
  2. son.query.filter(son.age==10)[0] 

11).查詢對(duì)象并返回指定數(shù)量的結(jié)果

  1. son.query.filter(son.age==10).limit(10).all() # 返回十個(gè)查找到的對(duì)象 

12).查詢時(shí)指定偏移量

  1. son.query.filter(son.age==10).offset(2).all() # 返回偏移了2的對(duì)象 

13).查找對(duì)象并排序

  1. son.query.filter(son.age==10).order_by(son.create_time.desc()).all() # 返回按降序排序的記錄 

14).查找對(duì)象返回分組結(jié)果

  1. son.query.filter(son.age==10).group_by(son.name).all() # 返回age為10的名字對(duì)象分組 

15).返回查詢結(jié)果的數(shù)量

  1. son.query.filter(son.age==10).count() # son的年齡為10的數(shù)量 

16).返回切片結(jié)果

  1. son.query(son).slice(10,40).all()   # son從10到40的記錄 
  2. son.query(son)[10:40] 

17).分頁(yè)獲取數(shù)據(jù)

  1. p=request.args.get('p'
  2. # 從請(qǐng)求的查詢字符串中獲取當(dāng)前頁(yè)面,返回一個(gè)每頁(yè)顯示3條記錄的分頁(yè)對(duì)象 
  3. paginate=son.query.paginate(p=int(p),per_page=3)  
  4. paginate 屬性: 
  5. pages     # 總共生成頁(yè)面數(shù)量 
  6. page      # 當(dāng)前頁(yè)數(shù) 
  7. has_next  # 判斷是否有下一頁(yè) 
  8. has_prev  # 判斷是否有上一頁(yè) 
  9. next_num  # 獲取下一頁(yè)的頁(yè)碼數(shù) 
  10. prev_num  # 獲取上一頁(yè)的頁(yè)碼數(shù) 
  11. items     # 獲取當(dāng)前頁(yè)的記錄 
  12. total     # 查詢返回的記錄總數(shù) 

18).查詢僅顯示一條記錄

  1. son.query(son).one() 

5.更新數(shù)據(jù)

  1. ss=son.query.get(1) 
  2. ss.name='fasd'     # 更改name的值來達(dá)到更新的目的 
  3. db.session.commit() 

6.刪除數(shù)據(jù)

  1. ss=son.query.get(1) 
  2. db.session.delete(ss) 
  3. db.session.commit() 

三、總結(jié)

Sqlalchemy支持很多表的建立和操作,通過對(duì)它的了解,我們可以很方便的操作數(shù)據(jù)庫(kù)的數(shù)據(jù)從而與前端頁(yè)面交互達(dá)到可視化的效果,通過這篇文章的學(xué)習(xí),相信你可以獨(dú)立開發(fā)一個(gè)小網(wǎng)站了。

本文轉(zhuǎn)載自微信公眾號(hào)「Python爬蟲與數(shù)據(jù)挖掘」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Python爬蟲與數(shù)據(jù)挖掘公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: Python爬蟲與數(shù)據(jù)挖掘
相關(guān)推薦

2016-11-08 10:24:37

FlaskPython插件

2023-06-08 08:13:43

2023-06-07 08:18:25

2021-09-12 17:25:12

SQLite數(shù)據(jù)庫(kù)

2023-06-09 07:55:09

2014-12-29 10:29:40

OpenStack數(shù)據(jù)庫(kù)SQLAlchem

2022-03-16 00:15:56

Flask擴(kuò)展插件

2015-01-12 15:07:56

SQLAlchemy數(shù)據(jù)庫(kù)開發(fā)OpenStac

2021-06-26 10:03:35

Python框架Flask

2021-07-01 09:08:03

Python網(wǎng)頁(yè)開發(fā)Flask

2016-09-23 13:34:15

PythonORMsqlalchemy

2021-11-26 22:51:31

FlaskBlueprintsViews

2024-10-30 15:53:59

2024-12-03 09:28:54

元組數(shù)據(jù)庫(kù)

2024-04-03 10:05:02

2022-08-31 15:09:03

PythonOthers

2009-09-11 10:48:25

數(shù)據(jù)庫(kù)交互

2010-06-11 16:51:44

MySQL數(shù)據(jù)庫(kù)

2010-06-12 14:40:28

2022-01-03 18:15:35

FlaskTepHttpRunner
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)