Flask-SQLAlchemy是一個Flask擴展,簡化了在Flask程序中使用SQLAlchemy的操做。SQLAlchemy是一個很強大的關係型數據庫框架,支持多種數據庫後臺。SQLAlchemy提供了高層ORM,也提供了使用數據庫原生SQL的低層功能。python
1).安裝flask-sqlalchemymysql
pip install flask-sqlalchemy
2). 安裝mysqldbsql
pip install flask-mysqldb
1). 程序使用的數據庫URL必須保存到Flask配置對象的SQLALCHEMY_DATABASE_URI鍵中。數據庫
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:password@127.0.0.1:3306/test'
2). 其餘flask
配置對象中還有一個頗有用的選項,即SQLALCHEMY_COMMIT_ON_TEARDOWN鍵,將其設爲True時,每次請求結束後都會自動提交數據庫中的變更。
配置的列表以下:
3). 鏈接數據庫session
不一樣的數據庫採用不一樣的引擎鏈接語句:oracle
(1)MySQL: mysql://username:password@hostname/database
(2)SQLite(Unix): sqlite:////absolute/path/to/database
(3)SQLite(Windows): sqlite:///c:/absolute/path/to/database
(4)Oracle: oracle://username:password@127.0.0.1:3306/databaseapp
參考代碼以下:框架
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 設置鏈接數據庫的URL app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:password@127.0.0.1:3306/test' # 設置每次請求結束後會自動提交數據庫的改動 app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True # 查詢時顯示原始SQL語句 app.config['SQLALCHEMY_ECHO'] = True db = SQLAlchemy(app)
在ORM中,模型通常是一個Python類,類中的屬性對應數據庫表中的列。
Flask-SQLAlchemy建立的數據庫實例爲模型提供了一個基類以及一系列輔助類和輔助函數,可用於定義模型的結構。
經常使用的sqlalchemy字段類型:函數
經常使用的sqlalchemy列表項
經常使用的sqlalchemy關係選項
參考代碼以下:
class Role(db.Model): __tablename__ = 'roles' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) user = db.relationship('User', backref='role') def __repr__(self): return '<Role %r>' % self.name class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True, index=True) email = db.Column(db.String(64), unique=True) pswd = db.Column(db.String(64)) role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) def __repr__(self): return 'User:%s' % self.name
#根據條件查詢一行數據 admin_role = Role.query.filter_by(role_name = 'Amdmin').first() #修改數據- admin_role.role_name = 'Admin' db.session.add(admin_role) db.session.commit()
variablelists= Variable.query.filter_by(env_id=env_id).all() for var in variablelists: db.session.delete(var) db.session.commit()
sql = u""" update net_internet_ip set removed = current_timestamp() where uuid not in :uuid and removed is null """ results = db.session.execute(sql, {"uuid": uuid})
所有代碼以下,經測試,已跑通。
#!/usr/bin/python # -*- coding: utf-8 -*- from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 設置鏈接數據庫的URL app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:password@127.0.0.1:3306/test' # 設置每次請求結束後會自動提交數據庫的改動 app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True # 查詢時顯示原始SQL語句 app.config['SQLALCHEMY_ECHO'] = True db = SQLAlchemy(app) class Role(db.Model): __tablename__ = 'roles' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) user = db.relationship('User', backref='role') def __repr__(self): return '<Role %r>' % self.name class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True, index=True) email = db.Column(db.String(64), unique=True) pswd = db.Column(db.String(64)) role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) def __repr__(self): return 'User:%s' % self.name if __name__ == '__main__': db.drop_all() db.create_all() ro1 = Role(name='admin') ro2 = Role(name='user') db.session.add_all([ro1, ro2]) db.session.commit() us1 = User(name='zhangsan', email='zhangsan@qq.com',pswd='12345a',role_id=ro1.id) us2 = User(name='lisi', email='lisi@qq.com', pswd='12345a', role_id=ro2.id) db.session.add_all([us1, us2]) db.session.commit() app.run(debug=True)