入門教程沒有告訴你的sqlalchemy常用操作
入門教程沒有告訴你的sqlalchemy常用操作
當用python的flask之類的框架進行web開發是, orm是一個常用的工具,可以大大降低開發的複雜度, 其中sqlalchemy又是其中最常用的庫, 基本的用法在這裡強烈 推薦一本書 Flask Web開發:基於Python的Web應用開發實戰 通過這本書可以很容易學會使用flask開發 一個網站的方法,但是這本書對裡面的常用庫 比如SQLAlchemy之類的介紹的很少,只有最基本的用法,我這裡補充一些平時會用到的常用用法
場景
我這裡有倆張表 Student 和 Class 一個班級有多個學生,而一個學生只有一個班級,使用flask-sqlalchemy定義如下
class Student(db.Model):nn __tablename__ = "students"nn id = db.Column(db.Integer,primary_key=True,autoincrement=True,index=True)n name = db.Column(db.String(255))n score = db.Column(db.Integer)nnclass Class(db.Model):nn __tablename__ = "classes"nn id = db.Column(db.Integer,primary_key=True,autoincrement=True,index=True)n name = db.Column(db.String(255))n teacher = db.Column(db.String(255))n
使用in, and, or等條件查詢
在這個包中,可以找見and , or 等操作
from sqlalchemy.sql.expression import and_,or_n
in操作在
student_ids = [1,2,3]n Student.query.filter(or_(n Student.id.in_(student_ids),n Student.id >= 10)n )n
不使用外鍵進行聯結查詢
在Flask Web開發:基於Python的Web應用開發實戰中, 一對多關係是使用外鍵維護的, 然而大部分時候, 設計資料庫都是盡量不使用外鍵, 手動維護他們的一致性, 更加靈活一些. 如果不使用外鍵, 需要引入這個包
from sqlalchemy.orm import foreign, remoten
然後在模型中定義如下
class Student(db.Model):nn __tablename__ = "students"nn id = db.Column(db.Integer,primary_key=True,autoincrement=True,index=True)n name = db.Column(db.String(255))n score = db.Column(db.Integer)nn class_id = id = db.Column(db.Integer, index=True)nn class_r = db.relationship(Class,n primaryjoin=foreign(class_id) == remote(Class.id),n backref=students, lazy=joined)nnclass Class(db.Model):nn __tablename__ = "classes"nn id = db.Column(db.Integer,primary_key=True,autoincrement=True,index=True)n name = db.Column(db.String(255))n teacher = db.Column(db.String(255))n
這樣通過Student的class_id欄位和Class的id欄位建立起了聯結而沒有在資料庫中存下外鍵,還可以維持 一對多關係,通過Student 的 class_r 訪問和他對應的Class, 通過Class的students可以訪問到與這個 班級對應的全部學生
查詢的時候 可以
index = Student.query.join(Class, Class.id == Student.class_id).n filter(and_(n Student.name != "A",n Student.score >= 60)).first()n
這樣來查詢
聚合查詢
Student.query(Student.name, func.count(*).label("student_count")).group_by(Student.name).all()n
如代碼所示,可以查詢出每個名字的學生數量
大批量插入
使用flask的資料庫的url建立一個engine
engine = create_engine(app.config["SQLALCHEMY_DATABASE_URI"], encoding="utf-8", echo=True)n
然後獲取一個conn執行插入或者查詢等操作
students = [Student(id=_id, name="s"+str(_id)) for _id in range(100)]nconn = engine.connect()nconn.execute(Student.__table__.insert(), students)n
總結
sqlalchemy是一個十分強大的工具, 可以用幾行清晰易懂的python 代碼 代替複雜的sql語句,而且支持各種複雜的查詢, 有時間一定要讀讀源碼
推薦閱讀:
※跟黃哥學python之類__call__方法
※Python 3 實現 Markdown 解析器
※量化策略系列教程:13布林強盜系統
※Python 抽取word文檔中的文本。
※黃哥Python轉載「Python』s super() considered super!」