成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

盤點Flask與數據庫的交互插件--Flask-Sqlalchemy

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

[[418400]]

大家好,我是Python進階者。

前言

在我們做web開發的時候,經常需要用到與數據庫交互,因為我們的數據通常都是保存在數據庫中的,如果有人需要訪問,就必須與數據庫訪問,所以今天我們介紹一個Flask中與數據庫交互的插件---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數據庫,所以這里重點介紹連接Mysql數據庫的方法。

1.連接數據庫

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

首先創建一個配置文件"config.py",內容為:

  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 

然后在應用中導入配置文件:

  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. db.create_all()  # 創建所有的數據庫 

2).直接寫在應用中讀取

  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   # 每次請求結束后都會自動提交數據庫中的變動 
  6. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True  # 動態追蹤修改設置,如未設置只會提示警告 
  7. db = SQLAlchemy(app) 

還有許多其它的配置參數,比如:

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

3).使用獨特的創建引擎

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

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

4).創建連接多個數據庫

  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數據庫中的表:

  1. __bind_key__ = 'users' 
  2. bind key 內部存儲在表的 info 字典中  即:info={'bind_key''users'

2.建立數據表并插入值

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) # 整數類型的自增主鍵 
  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. # 請求鉤子,第一次請求之前執行 
  23. @app.before_first_request 
  24. def create_table():  
  25.     db.drop_all()  # 刪除所有表 
  26.     db.create_all() # 創建新的表 
  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()  # 提交數據 
  36.     return use1.__repr__() # 返回用戶1的值 
  37.  
  38. if __name__ == '__main__':   
  39.     app.run(debug=True

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

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

  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. # 創建連接數據庫的引擎并且打開回顯 
  9. engine = create_engine("mysql+pymysql://root:123456@localhost/people",echo=True
  10. Session = sessionmaker(bind=engine) # 創建會話標記 
  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) # 刪除所有數據庫 
  25.     Base.metadata.create_all(engine) # 創建所有數據庫 
  26.      
  27. @app.route('/'
  28. def index(): 
  29.     userUser("hwhrr","123321"
  30.     session = Session()   # 創建會話 
  31.     session.add(user)  # 添加內容 
  32.     session.commit()  # 提交 
  33.     return user.__repr__() 
  34.  
  35. if __name__ == '__main__':   
  36.     app.run(debug=True

3.數據庫之間的關系

1). 一對一

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

  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.     #主要是要在一個表上設置uselist 然后設置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.     # 這里無需設置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’,然后需要建立外鍵和反射來互相引用建立一種關系,我們來看看:

  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:動態加載,只有用到了才加載 只可以用在一對多和多對多關系中 
  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')) # 建立外鍵關聯,指明表名和字段 
  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).多對一

就是將反射應用在子表上,與父表同時進行關聯。

  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')) # 建立外鍵關聯 
  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).多對多

設置一個關聯表來對兩個表同時進行管理。

  1. # 設置關聯表 
  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.     # 設置關聯表 動態加載 
  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

可以看出我們已經創建出了一張關聯表,名字就是我們設置的“glb”。

4.查看數據

1).查看全部數據(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).查詢第一個出現的數據

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

11).查詢對象并返回指定數量的結果

  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).查找對象返回分組結果

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

15).返回查詢結果的數量

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

16).返回切片結果

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

17).分頁獲取數據

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

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

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

5.更新數據

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

6.刪除數據

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

三、總結

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

本文轉載自微信公眾號「Python爬蟲與數據挖掘」,可以通過以下二維碼關注。轉載本文請聯系Python爬蟲與數據挖掘公眾號。

 

責任編輯:武曉燕 來源: Python爬蟲與數據挖掘
相關推薦

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數據庫

2023-06-09 07:55:09

2014-12-29 10:29:40

OpenStack數據庫SQLAlchem

2015-01-12 15:07:56

SQLAlchemy數據庫開發OpenStac

2022-03-16 00:15:56

Flask擴展插件

2021-07-01 09:08:03

Python網頁開發Flask

2021-06-26 10:03:35

Python框架Flask

2024-10-30 15:53:59

2016-09-23 13:34:15

PythonORMsqlalchemy

2021-11-26 22:51:31

FlaskBlueprintsViews

2024-12-03 09:28:54

元組數據庫

2009-09-11 10:48:25

數據庫交互

2010-06-12 14:40:28

2024-04-03 10:05:02

2010-06-11 16:51:44

MySQL數據庫

2022-01-03 18:15:35

FlaskTepHttpRunner

2022-08-31 15:09:03

PythonOthers
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区手机在线 | 国产午夜精品一区二区三区 | 亚洲精品国产综合区久久久久久久 | 欧美日韩不卡合集视频 | 亚洲精品久久久久久一区二区 | 中文在线一区二区 | 一区二区三区免费网站 | 亚洲成人一区 | 久久在看 | se婷婷 | 亚洲一区二区视频在线观看 | 日产精品久久久一区二区福利 | 国产视频中文字幕 | 精品国产青草久久久久福利 | 亚洲成人自拍 | 91视在线国内在线播放酒店 | 国产伦精品一区二区三区视频金莲 | 欧美video| 精品欧美一区二区中文字幕视频 | 国产精品美女久久久久久免费 | 999精品网 | 国产精品无码久久久久 | 午夜一区 | 播放一级黄色片 | 亚洲网站在线观看 | 美女视频黄色的 | 美女视频一区二区三区 | 亚洲乱码一区二区 | 国产精品久久久久久久久大全 | 亚洲激精日韩激精欧美精品 | 中文字幕专区 | 日日夜夜天天 | 欧美三区| 欧美1区| 韩日一区二区 | 国产日韩一区二区三区 | 亚洲黄色一级 | 国产乱xxav| 免费观看毛片 | av网站免费观看 | 免费在线观看一区二区三区 |