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

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

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

[[418400]]

大家好,我是Python進階者。

前言

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

一、安裝并導入

  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ù)庫,所以這里重點介紹連接Mysql數(shù)據(jù)庫的方法。

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

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

首先創(chuàng)建一個配置文件"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)用中導入配置文件:

  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ù)庫配置文件 
  6. db=SQLAlchemy(app) 
  7. db.create_all()  # 創(chuàng)建所有的數(shù)據(jù)庫 

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

  1. app=Flask(__name__) 
  2. p.install_as_MySQLdb()   # mysql連接器,因為不支持py3版本,所以必須加上這行 
  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   # 每次請求結(jié)束后都會自動提交數(shù)據(jù)庫中的變動 
  6. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True  # 動態(tài)追蹤修改設(shè)置,如未設(shè)置只會提示警告 
  7. db = SQLAlchemy(app) 

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

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

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

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

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

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

  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ù)庫中的表:

  1. __bind_key__ = 'users' 
  2. bind key 內(nèi)部存儲在表的 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.         # 打印當前類名和它的實例化后的值 
  19.         return ' %s is %r' %(self.__class__.__name__,self.username)  
  20.      
  21.      
  22. # 請求鉤子,第一次請求之前執(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]) # 添加所有的用戶,添加一個用戶去掉_all后面加一個元祖即可  
  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(默認), Sequenceobjects(序列)定義 
  6. key         列名的別名 
  7. primary_key 如果為True,則是主鍵 
  8. nullable    如果是True,則可以為null 
  9. default     設(shè)置默認值,默認是None 
  10. index       是否是索引,默認是True 
  11. unique      是否唯一鍵,默認是False 
  12. onupdate    指定一個更新時候的值 
  13. autoincrement 設(shè)置為整型自動增長 
  14. quote         如果列明是關(guān)鍵字,則強制轉(zhuǎn)義,默認False 

2).利用原始引擎來創(chuàng)建會話(稍微復雜點)

  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ù)庫的引擎并且打開回顯 
  9. engine = create_engine("mysql+pymysql://root:123456@localhost/people",echo=True
  10. Session = sessionmaker(bind=engine) # 創(chuàng)建會話標記 
  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ù)庫 
  25.     Base.metadata.create_all(engine) # 創(chuàng)建所有數(shù)據(jù)庫 
  26.      
  27. @app.route('/'
  28. def index(): 
  29.     userUser("hwhrr","123321"
  30.     session = Session()   # 創(chuàng)建會話 
  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ù)庫之間的關(guān)系

1). 一對一

只需讓兩張表都在同等的位置上,屬于雙向關(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.     #主要是要在一個表上設(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).一對多

我們需要建立一個主表和一個子表,分別命名為“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這個模型,backref可替代Father.id訪問father模型 
  7.     son_fa=db.relationship('son',backref='fa',lazy='dynamic'
  8.     # lazy表示加載方式: 
  9.     # dynamic:動態(tài)加載,只有用到了才加載 只可以用在一對多和多對多關(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).多對一

就是將反射應(yīng)用在子表上,與父表同時進行關(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這個模型 
  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這個模型 
  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).多對多

設(shè)置一個關(guān)聯(liá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)表 動態(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)表,名字就是我們設(shè)置的“glb”。

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

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

  1. father.query.all() 

2).精準查詢(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).一對多正向查詢

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

9).一對多反向查詢

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

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

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

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

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

12).查詢時指定偏移量

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

13).查找對象并排序

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

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

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

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).分頁獲取數(shù)據(jù)

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

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

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

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

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

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

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

三、總結(jié)

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

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

 

責任編輯:武曉燕 來源: 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ù)庫

2023-06-09 07:55:09

2014-12-29 10:29:40

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

2015-01-12 15:07:56

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

2022-03-16 00:15:56

Flask擴展插件

2021-06-26 10:03:35

Python框架Flask

2021-07-01 09:08:03

Python網(wǎng)頁開發(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ù)庫

2024-04-03 10:05:02

2010-06-12 14:40:28

2010-06-11 16:51:44

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

2009-09-11 10:48:25

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

2022-01-03 18:15:35

FlaskTepHttpRunner

2022-08-31 15:09:03

PythonOthers
點贊
收藏

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