单表操作
增
@app.route("/add_book") def add_book(): ro1 = Books(name='三国演义')#增加Books中name为三国演义的数据 db.session.add(ro1)#增加 db.session.commit()#提交 return "添加成功"
删
@app.route("/del_book") def del_book(): rol = Books.query.filter_by(name="水浒传").first()#删除Books中name为水浒传的数据,其中query固定写法,first第一个 db.session.delete(rol)#删除 db.session.commit()#提交 return "删除成功"
改
@app.route("/alter_book") def alter_book(): rol = Books.query.filter_by(name="三国演义").first()#与删除大致相同 rol.name = "射雕英雄传"#更改内容 db.session.commit()#提交 return "修改成功"
查
SQLAlchemy中关于查询分为两部分:一个是查询过滤器,一个是查询执行器。
过滤器
过滤器 | 说明 |
---|---|
filter() | 把过滤器添加到原查询上,返回一个新查询 |
filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |
limit | 使用指定的值限定原查询返回的结果 |
offset() | 偏移原查询返回的结果,返回一个新查询 |
order_by() | 根据指定条件对原查询结果进行排序,返回一个新查询 |
group_by() | 根据指定条件对原查询结果进行分组,返回一个新查询 |
执行器
方法 | 说明 |
---|---|
all() | 以列表形式返回查询的所有结果 |
first() | 返回查询的第一个结果,如果未查到,返回None |
first_or_404() | 返回查询的第一个结果,如果未查到,返回404 |
get() | 返回指定主键对应的行,如不存在,返回None |
get_or_404() | 返回指定主键对应的行,如不存在,返回404 |
count() | 返回查询结果的数量 |
paginate() | 返回一个Paginate对象,它包含指定范围内的结果 |
一对多表
在多的一方创建一个字段指向另一个表中的唯一标识(id),外键
增删与单表操作大致相同
查询数据
@app.route("/select_book") def select_book(): # 目标:查询南方出版社出版的书籍 res = Publishers.query.filter(Publishers.name == "南方出版社").first() rols = Books.query.filter(Books.publish_id == res.id).all() print(rols) return "查询成功"
简:在表中设置字段时添加一个内容(红色),操作方法变简
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是表模型类名 def __repr__(self): return 'User:%s' % self.name @app.route("/select_book") def select_book(): # 目标:查询南方出版社出版的书籍 res = Publishers.query.filter(Publishers.name == "南方出版社").first().to_book print(res) return "查询成功"
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是表模型类名,backref是反向查询,不用在Book的表查询pub再复制relationship的代码 def __repr__(self): return 'User:%s' % self.name @app.route("/select_book") def select_book(): # 目标:查询南方出版社出版的书籍 res = Publishers.query.filter(Publishers.name == "南方出版社").first().to_book print(res) return "查询成功"
多对多
新建一张表用多个外键将多张表关联
class Bookspri(db.Model): id = db.Column(db.Integer, primary_key=True) book_id=db.Column(db.Integer,db.ForeignKey("book.id"))#设置外键,表名.字段名 author_id=db.Column(db.Integer,db.ForeignKey("author.id"))#设置外键,表名.字段名
(删除book中的一行内容会将关联的内容也删除)
(使用relationship关联第三张表的secondary="author__book"其中自动的表名下划线会将一个变成两个,除非自己使用__tablename__设置表名)
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) # 图书表 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 "图书名:%s|价格为%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=["GET", "POST"]) def index(): # 查询南方出版社出版的所有书籍 # res = Publisher.query.filter_by(name="南方出版社").first().to_books # res = Book.query.filter(Book.pub_id == pub.id).all() # 查询渣男日记的出版社名 # book = Book.query.filter_by(title="渣男日记").first() # res = Publisher.query.filter_by(id=book.pub_id). # res = Book.query.filter_by(title="渣男日记").first().to_pub # print(res) # 增加 # new_obj = Author_Book() # new_obj.author_id = Author.query.filter_by(name="小黑").first().id # new_obj.book_id = Book.query.filter_by(title="渣男日记").first().id # # new_obj1 = Author_Book() # new_obj1.author_id = Author.query.filter_by(name="小川").first().id # new_obj1.book_id = Book.query.filter_by(title="渣男日记").first().id # # db.session.add(new_obj) # db.session.add(new_obj1) # db.session.commit() # res = Book.query.filter_by(title="渣男日记").first().authors # print(res) # new_book = Book() # new_book.title = "20人工日记" # new_book.price = 999 # new_book.pub_id = 1 # new_book.authors = Author.query.all() # db.session.add(new_book) # db.session.commit() # book = Book.query.filter_by(title="渣男日记").first() # book.authors = Author.query.all() # db.session.commit() # book = Book.query.filter_by(title="金").first() # book.authors = Author.query.filter_by(name="小黑").first() # 错误,必须是列表 # db.session.commit() # new_book = Book() # new_book.title = "20人工日记2" # new_book.price = 888 # new_book.pub_id = 1 # new_book.authors = [Author(name="老五", age=20), Author(name="老liu", age=20)] # db.session.add(new_book) # db.session.commit() # book = Book.query.filter_by(title="20人工日记2").first() # db.session.delete(book) # db.session.commit() res = Author.query.filter_by(name="小黑").first().books print(res) return "成功!" if __name__ == '__main__': db.create_all() app.run()