概要的說:
SQLAlchemy是python社區使用最廣泛的ORM之一,SQL-Alchmy直譯過來就是SQL煉金術。
Flask-SQLAlchemy集成了SQLAlchemy,它簡化了連接數據庫服務器、管理數據庫操作會話等各類工作,讓Flask中的數據處理體驗變得更加輕松。
雖然我們要使用的大部分類和函數都由SQLAlchmey提供,但在Flask-SQLAlchemy中,大多數情況下,我們不需要手動從SQLAlchemy導入類或函數。在sqlalchemy和sqlalchemy.orm模塊中實現的類和函數
,以及其他幾個常用的模塊和對象都可以作為db對象的屬性調用。當我們創建這樣的調用時,Flask-SQLAlchemy會自動把這些調用轉發到對應的類、函數或模塊
具體區別:
區別1:定義模型:
flask_sqlalchemy需要使用db.Column,而sqlalchemy則不需要
flask_sqlalchemy寫法:
1 class Role(db.Model): 2 __tablename__ = 'roles'
3 id = db.Column(db.Integer, primary_key=True) 4 name = db.Column(db.String(64)) 5 user = db.relationship('User', backref='role') 6
7 def __repr__(self): 8 return '<Role %r>' % self.name
sqlalcehmy寫法:
1 class EnvConfig(Base): 2 __tablename__="env_config"
3 id=Column(Integer,primary_key=True) 4 host = Column(String(50)) # 默認值 1 0:appapi.5i5j.com,
5 def __repr__(self): 6 return "<EnvConfig.%s>"%self.host
區別2:聲明字段類型
flask_sqlalchemy使用定義字段類型時無須額外導入類型,一切類型都通過db對象直接調用
1 from flask import Flask 2 from flask_sqlalchemy import SQLAlchemy 3
4 app = Flask(__name__) 5
6 # 設置連接數據庫的URL
7 # 不同的數據庫采用不同的引擎連接語句:
8 # MySQL: mysql://username:password@hostname/database
9
10 app.config['SQLALCHEMY_DATABASE_URI'] ='mysql+mysqlconnector://root:admin123456@10.1.71.32:3306/test'
11
12 # 設置每次請求結束后會自動提交數據庫的改動
13 app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True 14 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True 15
16 # 查詢時顯示原始SQL語句
17 app.config['SQLALCHEMY_ECHO'] = False 18 db = SQLAlchemy(app)
sqlalchemy需要單獨導入字段聲明類型:
1 from sqlalchemy.ext.declarative import declarative_base 2 from sqlalchemy import Column,Integer,Text,String,Enum 3 Base =declarative_base()
完整的代碼片斷:
# 導入依賴 from sqlalchemy import Column, String, create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base # 創建對象的基類 Base = declarative_base() # 定義User對象 class User(Base): # 表的名字 __tablename__ = 'user' # 表的結構 id = Column(String(20), primary_key=True) name = Column(String(20)) # 初始化數據庫鏈接 engine = create_engine('mysql+mysqlconnector://root:123456@localhost:3306/test') # 創建DBSession類型 DBSession = sessionmaker(bind=engine) # 添加 # 創建Session對象 session = DBSession() # 創建User對象 new_user = User(id='5', name='Bob') # 添加到session session.add(new_user) # 提交 session.commit() # 關閉session session.close() # 查詢 # 創建session session = DBSession() # 利用session創建查詢,query(對象類).filter(條件).one()/all() user = session.query(User).filter(User.id=='5').one() print('type:{0}'.format(type(user))) print('name:{0}'.format(user.name)) # 關閉session session.close() # 更新 session = DBSession() user_result = session.query(User).filter_by(id='1').first() user_result.name = "jack" session.commit() session.close() # 刪除 session = DBSession() user_willdel = session.query(User).filter_by(id='5').first() session.delete(user4._willdel) session.commit() session.close()
區別3:
查詢方式不一樣
sqlalchemy通過session.query(模型名)查詢
而flask_sqlalchemy則是通過 模型名.query查詢
#SQLAlchemy result_id = session.query(ScriptRunResult).order_by(ScriptRunResult.id.desc()).all()[0].id result_id = #Flask-SQLAlchemy ScriptRunResult.query.order_by(ScriptRunResult.id.desc()).all()[0].id