偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

[[418400]]

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

前言

在我們做web開(kāi)發(fā)的時(shí)候,經(jīng)常需要用到與數(shù)據(jù)庫(kù)交互,因?yàn)槲覀兊臄?shù)據(jù)通常都是保存在數(shù)據(jù)庫(kù)中的,如果有人需要訪(fǎng)問(wèn),就必須與數(shù)據(jù)庫(kù)訪(fǎng)問(wèn),所以今天我們介紹一個(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).寫(xiě)在配置文件中然后讀取

首先創(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).直接寫(xiě)在應(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    # 可以用于顯式地禁用或啟用查詢(xún)記錄 
  6. SQLALCHEMY_ECHO              # 為T(mén)ure時(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ù)建立連接了,接下來(lái)我們來(lái)建立一張表。

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"類(lèi)

  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ù)類(lèi)型的自增主鍵 
  10.     username=db.Column(db.String(100),nullable=False)  # 字符類(lèi)型不為空 
  11.     password=db.Column(db.String(100),nullable=False)  # 字符類(lèi)型不為空 
  12.  
  13.     def __init__(self,username,password): 
  14.         self.username=username 
  15.         self.password=password 
  16.  
  17.     def __repr__(self): 
  18.         # 打印當(dāng)前類(lèi)名和它的實(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]) # 添加所有的用戶(hù),添加一個(gè)用戶(hù)去掉_all后面加一個(gè)元祖即可  
  35.     db.session.commit()  # 提交數(shù)據(jù) 
  36.     return use1.__repr__() # 返回用戶(hù)1的值 
  37.  
  38. if __name__ == '__main__':   
  39.     app.run(debug=True

  1. Column        參數(shù)列表   
  2. name          列名 
  3. type_         類(lèi)型 
  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).利用原始引擎來(lái)創(chuàng)建會(huì)話(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ù)的引擎并且打開(kāi)回顯 
  9. engine = create_engine("mysql+pymysql://root:123456@localhost/people",echo=True
  10. Session = sessionmaker(bind=engine) # 創(chuàng)建會(huì)話(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ì)話(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.     # 這里無(wú)需設(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’,然后需要建立外鍵和反射來(lái)互相引用建立一種關(guān)系,我們來(lái)看看:

  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訪(fǎng)問(wèn)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)表來(lái)對(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)查詢(xún)(filter_by)

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

3).模糊查詢(xún)(filter)

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

4).主鍵查詢(xún)(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ì)多正向查詢(xún)

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

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

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

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

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

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

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

12).查詢(xún)時(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).返回查詢(xún)結(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)求的查詢(xún)字符串中獲取當(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     # 查詢(xún)返回的記錄總數(shù) 

18).查詢(xún)僅顯示一條記錄

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

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

  1. ss=son.query.get(1) 
  2. ss.name='fasd'     # 更改name的值來(lái)達(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支持很多表的建立和操作,通過(guò)對(duì)它的了解,我們可以很方便的操作數(shù)據(jù)庫(kù)的數(shù)據(jù)從而與前端頁(yè)面交互達(dá)到可視化的效果,通過(guò)這篇文章的學(xué)習(xí),相信你可以獨(dú)立開(kāi)發(fā)一個(gè)小網(wǎng)站了。

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

 

責(zé)任編輯:武曉燕 來(lái)源: Python爬蟲(chóng)與數(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

2015-01-12 15:07:56

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

2022-03-16 00:15:56

Flask擴(kuò)展插件

2021-06-26 10:03:35

Python框架Flask

2021-07-01 09:08:03

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

2016-09-23 13:34:15

PythonORMsqlalchemy

2024-10-30 15:53:59

2021-11-26 22:51:31

FlaskBlueprintsViews

2024-12-03 09:28:54

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

2024-04-03 10:05:02

2010-06-12 14:40:28

2022-01-03 18:15:35

FlaskTepHttpRunner

2009-09-11 10:48:25

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

2010-06-11 16:51:44

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

2012-03-16 09:29:47

國(guó)產(chǎn)數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

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