單表操作
增
@app.route("/add_book") def add_book(): ro1 = Books(name='三國(guó)演義')#增加Books中name為三國(guó)演義的數(shù)據(jù) db.session.add(ro1)#增加 db.session.commit()#提交 return "添加成功"
刪
@app.route("/del_book") def del_book(): rol = Books.query.filter_by(name="水滸傳").first()#刪除Books中name為水滸傳的數(shù)據(jù),其中query固定寫(xiě)法,first第一個(gè) db.session.delete(rol)#刪除 db.session.commit()#提交 return "刪除成功"
改
@app.route("/alter_book") def alter_book(): rol = Books.query.filter_by(name="三國(guó)演義").first()#與刪除大致相同 rol.name = "射雕英雄傳"#更改內(nèi)容 db.session.commit()#提交 return "修改成功"
查
SQLAlchemy中關(guān)于查詢(xún)分為兩部分:一個(gè)是查詢(xún)過(guò)濾器,一個(gè)是查詢(xún)執(zhí)行器。
過(guò)濾器
| 過(guò)濾器 | 說(shuō)明 |
|---|---|
| filter() | 把過(guò)濾器添加到原查詢(xún)上,返回一個(gè)新查詢(xún) |
| filter_by() | 把等值過(guò)濾器添加到原查詢(xún)上,返回一個(gè)新查詢(xún) |
| limit | 使用指定的值限定原查詢(xún)返回的結(jié)果 |
| offset() | 偏移原查詢(xún)返回的結(jié)果,返回一個(gè)新查詢(xún) |
| order_by() | 根據(jù)指定條件對(duì)原查詢(xún)結(jié)果進(jìn)行排序,返回一個(gè)新查詢(xún) |
| group_by() | 根據(jù)指定條件對(duì)原查詢(xún)結(jié)果進(jìn)行分組,返回一個(gè)新查詢(xún) |
執(zhí)行器
| 方法 | 說(shuō)明 |
|---|---|
| all() | 以列表形式返回查詢(xún)的所有結(jié)果 |
| first() | 返回查詢(xún)的第一個(gè)結(jié)果,如果未查到,返回None |
| first_or_404() | 返回查詢(xún)的第一個(gè)結(jié)果,如果未查到,返回404 |
| get() | 返回指定主鍵對(duì)應(yīng)的行,如不存在,返回None |
| get_or_404() | 返回指定主鍵對(duì)應(yīng)的行,如不存在,返回404 |
| count() | 返回查詢(xún)結(jié)果的數(shù)量 |
| paginate() | 返回一個(gè)Paginate對(duì)象,它包含指定范圍內(nèi)的結(jié)果 |
一對(duì)多表
在多的一方創(chuàng)建一個(gè)字段指向另一個(gè)表中的唯一標(biāo)識(shí)(id),外鍵
增刪與單表操作大致相同
查詢(xún)數(shù)據(jù)
@app.route("/select_book") def select_book(): # 目標(biāo):查詢(xún)南方出版社出版的書(shū)籍 res = Publishers.query.filter(Publishers.name == "南方出版社").first() rols = Books.query.filter(Books.publish_id == res.id).all() print(rols) return "查詢(xún)成功"
簡(jiǎn):在表中設(shè)置字段時(shí)添加一個(gè)內(nèi)容(紅色),操作方法變簡(jiǎn)
class Publishers(db.Model): __tablename__ = 'publishers' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) city = db.Column(db.String(64)) to_book = db.relationship("Book")#Book是表模型類(lèi)名 def __repr__(self): return 'User:%s' % self.name @app.route("/select_book") def select_book(): # 目標(biāo):查詢(xún)南方出版社出版的書(shū)籍 res = Publishers.query.filter(Publishers.name == "南方出版社").first().to_book print(res) return "查詢(xún)成功"
class Publishers(db.Model): __tablename__ = 'publishers' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) city = db.Column(db.String(64)) to_book = db.relationship("Book",backref="to_pub")#Book是表模型類(lèi)名,backref是反向查詢(xún),不用在Book的表查詢(xún)pub再?gòu)?fù)制relationship的代碼 def __repr__(self): return 'User:%s' % self.name @app.route("/select_book") def select_book(): # 目標(biāo):查詢(xún)南方出版社出版的書(shū)籍 res = Publishers.query.filter(Publishers.name == "南方出版社").first().to_book print(res) return "查詢(xún)成功"
多對(duì)多
新建一張表用多個(gè)外鍵將多張表關(guān)聯(lián)
class Bookspri(db.Model): id = db.Column(db.Integer, primary_key=True) book_id=db.Column(db.Integer,db.ForeignKey("book.id"))#設(shè)置外鍵,表名.字段名 author_id=db.Column(db.Integer,db.ForeignKey("author.id"))#設(shè)置外鍵,表名.字段名
(刪除book中的一行內(nèi)容會(huì)將關(guān)聯(lián)的內(nèi)容也刪除)
(使用relationship關(guān)聯(lián)第三張表的secondary="author__book"其中自動(dòng)的表名下劃線會(huì)將一個(gè)變成兩個(gè),除非自己使用__tablename__設(shè)置表名)
from flask import Flask from flask_sqlalchemy import SQLAlchemy class Config(object): DEBUG = True SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/demo1" SQLALCHEMY_TRACK_MODIFICATIONS = False app = Flask(__name__) app.config.from_object(Config) db = SQLAlchemy(app) # 圖書(shū)表 class Book(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(64), nullable=False) price = db.Column(db.Integer) pub_id = db.Column(db.Integer, db.ForeignKey("publisher.id")) # to_pub = db.relationship("Publisher") authors = db.relationship("Author", secondary="author__book", backref="books") def __repr__(self): return "圖書(shū)名:%s|價(jià)格為%s" % (self.title, self.price) # 出版社表 class Publisher(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), nullable=False) address = db.Column(db.String(64), nullable=False) to_books = db.relationship("Book", backref="to_pub") # 作者表 class Author(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), nullable=False) age = db.Column(db.Integer) class Author_Book(db.Model): id = db.Column(db.Integer, primary_key=True) author_id = db.Column(db.Integer, db.ForeignKey("author.id")) book_id = db.Column(db.Integer, db.ForeignKey("book.id")) @app.route("/", methods=[" 主站蜘蛛池模板: 少妇人妻偷人精品免费| 国产综合久久久久久鬼色| 香蕉久久夜色精品国产成人| 国产一级r片内射免费视频| 免费无码AV一区二区波多野结衣| 欧美丰满熟妇xxxx性| 中文午夜乱理片无码| 中文字幕人妻有码久视频| 十八禁午夜福利免费网站| 浪潮av色综合久久天堂| 亚洲av永久无码精品成人| 毛葺葺老太做受视频| 美乳丰满人妻无码视频| 女同另类激情在线三区| 国产18禁一区二区三区| 亚洲电影在线观看| 色综合一本到久久亚洲91| 少妇人妻偷人精品无码视频| 亚洲乱码一二三四区国产| 国产日韩精品欧美一区灰| 欧美人成在线播放网站免费| 99午夜精品亚洲一区二区| 欧洲精品色在线观看| 美女胸18下看禁止免费视频| 国产精品系列在线免费看| 97久久精品无码一区二区天美| 天天摸天天做天天添欧美| 2020中文字字幕在线不卡| 欧美成人猛片aaaaaaa| 一个人免费观看WWW在线视频| 忘忧草www日本韩国| a级亚洲片精品久久久久久久| 成人午夜视频一区二区无码| 国产AV福利第一精品| 国日韩精品一区二区三区| 国偷自产一区二区免费视频| 国产精品天天看天天狠| 日韩欧美亚洲综合久久| 国产一区二区不卡91| 亚洲av产在线精品亚洲第一站| 欧美福利电影A在线播放|