1. 介紹
SQLAlchemy是一個基於Python實現的ORM框架,能滿足大多數數據庫操作需求,同時支持多種數據庫引擎(SQLite,MySQL,Postgresql,Oracle等)
SQLAlchemy組件中最有名的是它的對象關係映射器(ORM)
ORM 將數據庫中的表與面嚮對象語言中的類建立了一種對應關係
這樣,我們要操作數據庫,數據庫中的表或者表中的一條記錄就可以直接通過操作類或者類實例來完成。
優點:
對數據表的抽象,允許開發人員首先考慮數據模型,同時使得Python程序更加簡潔易讀。
對各種數據庫引擎的封裝,使得開發人員在面對不同數據庫時,只需要做簡單修改即可,工作量大大減少。
2.使用
SQLAlchemy本身無法操作數據庫,必須依賴pymsql等第三方插件。根據配置文件的不同調用不同的數據庫API,從而實現對數據庫的操作
MySQL-Python mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> pymysql mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] MySQL-Connector mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> cx_Oracle oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
其他可參考此處:http://docs.sqlalchemy.org/en/latest/dialects/index.html
2.1 使用flask-sqlalchemy的使用
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 數據庫類型://用戶名:密碼(沒有密碼則爲空,不填)@數據庫主機地址/數據庫名?編碼 DB_URL = 'mysql+pymysql://root:@localhost/test?charset=utf8' # 添加到全局配製中,這步必學要有 app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) class Parent(db.Model): __tablename__ = 'parent' id = db.Column(db.Integer, primary_key=True) par_name = db.Column(db.String(50), nullable=False) children = db.relationship("Child", backref="parent") # 在父表類中通過relationship() 方法來引用子表的類集合 # 當我們需要在父表中添加子表關係時使用 relationship,這樣子表將會在多對一的關係中通過.parent的方式獲得父表的屬性 class Child(db.Model): __tablename__ = 'child' id = db.Column(db.Integer, primary_key=True) child_name = db.Column(db.String(50), nullable=False) parent_id = db.Column(db.Integer, db.ForeignKey('parent.id')) # 在子表類中通過 foreign key (外鍵)引用父表的參考字段 # db.drop_all() #刪除表 # db.create_all() #創建表 # 添加數據 # par1 = Parent(par_name='爸爸1') # par2 = Parent(par_name='爸爸2') # chi = Child(child_name='兒子1',parent_id=2) # db.session.add(par1) # db.session.add(par2) # db.session.add(chi) # db.session.commit() # 查看數據 # par =Parent.query.all() # print(par) # [<Parent 1>, <Parent 2>] # chi = Child.query.filter(Child.parent_id).first().child_name # print(chi) # 兒子1 # 修改數據 # chi = Child.query.filter(Child.parent_id).first() # chi.child_name = "好兒子" # db.session.commit() # 刷新數據庫,可以看見數據已經更新 # 刪除數據 # par =Parent.query.filter(Parent.id==1).first() # db.session.delete(par) # db.session.commit() # 刷新數據庫,id=1的數據已經不存在 @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run(port=5050)
最終的效果
2.2 直接使用sqlalchemy