当前位置:   article > 正文

关于flask入门教程-图书借阅系统-flask_SQLAlchemy高级用法

基于flask的图书借阅系统

608048bae60970d15d4b123f681904a6.png

flask中一般使用flask-SQLAlchemy来操作数据库,使用起来比较简单,易于操作。而flask-SQLAlchemy是SQLAlchemy的flask实现。

在Flask-SQLAlchemy中,查询操作是通过query对象操作数据。最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。

本部分之所以迟迟未交差,主要是flask-SQLAlchemy关于query的用法实在太少了,而且没有几个是比较全面的,动手加验证花了不少的时间,而且很多等效的语法,想比较出来个优劣势,选择最适合自己的。

本文主要验证了单表的全表查询、单表的单字段查询(like、==、>、<、in等等),单表的多字段查询(and_、or_)进行组合,多表的组合查询等等。感觉这里面like有多种形式,filter和filter_by在等值上符号不同,in转换和理解上有些困难,总之就是在对象编程和sql编程之间的困扰。

  1. def testquery():
  2. # --单表查询
  3. print('----------------单表+全表查询------------------')
  4. # select book.isbnno, book.bookname, book.publisher, book.publicationdate, book.booktype, book.stockdate from bookinfo book
  5. print('BookInfo.query.all()')
  6. queryinfo = BookInfo.query.all()
  7. for i in queryinfo:
  8. print(i.isbnno, i.bookname, i.publisher,i.publicationdate, i.booktype, i.stockdate)
  9. print('db.session.query(BookInfo).all()')
  10. queryinfo = db.session.query(BookInfo).all()
  11. for i in queryinfo:
  12. print(i.isbnno, i.bookname, i.publisher,i.publicationdate, i.booktype, i.stockdate)
  13. print('db.session.query(BookInfo.isbnno, BookInfo.bookname, BookInfo.publisher...).all()')
  14. queryinfo = db.session.query(BookInfo.isbnno, BookInfo.bookname, BookInfo.publisher,BookInfo.publicationdate, BookInfo.booktype, BookInfo.stockdate).all()
  15. for i in queryinfo:
  16. print(i.isbnno, i.bookname, i.publisher,i.publicationdate, i.booktype, i.stockdate)
  17. print('db.session.execute(sql)')
  18. sql='select * from bookinfo'
  19. queryinfo = db.session.execute(sql)
  20. for i in queryinfo:
  21. print(i.isbnno, i.bookname, i.publisher,i.publicationdate, i.booktype, i.stockdate)
  1. print('----------------单表+单字段查询+精确查询------------------')
  2. # select book.isbnno, book.bookname, book.publisher, book.publicationdate, book.booktype, book.stockdate from bookinfo book
  3. # where book.isbnno ='ISBN0001'
  4. isbnno = 'ISBN0001'
  5. # --单表查询,单字段查询1
  6. from sqlalchemy import select
  7. print('select(BookInfo).where(BookInfo.isbnno == isbnno)')
  8. queryinfo = select(BookInfo).where(BookInfo.isbnno == isbnno)
  9. print(queryinfo)
  10. # --单表查询,单字段查询1
  11. print('BookInfo.query.filter_by(isbnno=isbnno).all()')
  12. queryinfo = BookInfo.query.filter_by(isbnno=isbnno).all()
  13. for i in queryinfo:
  14. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  15. print('db.session.query(BookInfo).filter(BookInfo.isbnno==isbnno).all()')
  16. queryinfo = db.session.query(BookInfo).filter(BookInfo.isbnno==isbnno)
  17. for i in queryinfo:
  18. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  19. print('db.session.query(BookInfo.isbnno, BookInfo.bookname, BookInfo.publisher...).filter(BookInfo.isbnno==isbnno).all()')
  20. queryinfo = db.session.query(BookInfo.isbnno, BookInfo.bookname, BookInfo.publisher, BookInfo.publicationdate,
  21. BookInfo.booktype, BookInfo.stockdate).filter(BookInfo.isbnno==isbnno).all()
  22. for i in queryinfo:
  23. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  24. print('db.session.execute(sql, params)')
  25. sql = 'select * from bookinfo where isbnno=:isbnno'
  26. params = {'isbnno': 'ISBN0001'}
  27. queryinfo = db.session.execute(sql, params)
  28. for i in queryinfo:
  29. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  30. print('----------------单表+单字段查询+like模糊查询------------------')
  31. # select book.isbnno, book.bookname, book.publisher, book.publicationdate, book.booktype, book.stockdate from bookinfo book
  32. # where book.publisher like '%电子工业%'
  33. publisher = '%电子工业%'
  34. print('BookInfo.query.filter(BookInfo.publisher.ilike(publisher))')
  35. queryinfo = BookInfo.query.filter(BookInfo.publisher.ilike(publisher))
  36. for i in queryinfo:
  37. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  38. publisher = '电子工业'
  39. print('BookInfo.query.filter(BookInfo.publisher.contains(publisher))')
  40. queryinfo = BookInfo.query.filter(BookInfo.publisher.contains(publisher))
  41. for i in queryinfo:
  42. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  43. publisher = '电子工业'
  44. print("db.session.query(BookInfo).filter(BookInfo.publisher.like('%{keyword}%'.format(keyword=publisher))).all()")
  45. queryinfo = db.session.query(BookInfo).filter(
  46. BookInfo.publisher.like('%{keyword}%'.format(keyword=publisher))).all()
  47. for i in queryinfo:
  48. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  49. publisher = '%电子工业%'
  50. print("db.session.query(BookInfo).filter(BookInfo.publisher.like('{keyword}'.format(keyword=publisher))).all()")
  51. queryinfo = db.session.query(BookInfo).filter(
  52. BookInfo.publisher.like('{keyword}'.format(keyword=publisher))).all()
  53. for i in queryinfo:
  54. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  55. print('db.session.execute(sql, params)')
  56. sql = 'select * from bookinfo where publisher like :publisher'
  57. params = {'publisher': '%电子工业%'}
  58. queryinfo = db.session.execute(sql, params)
  59. for i in queryinfo:
  60. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  61. print('----------------单表+单字段查询+><查询------------------')
  62. # select book.isbnno, book.bookname, book.publisher, book.publicationdate, book.booktype, book.stockdate from bookinfo book
  63. # where book.publicationdate >'2012'
  64. publicationdate = '2012'
  65. print("db.session.query(BookInfo).filter(BookInfo.publicationdate>publicationdate).all()")
  66. queryinfo = db.session.query(BookInfo).filter(BookInfo.publicationdate>publicationdate).all()
  67. for i in queryinfo:
  68. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  69. # select book.isbnno, book.bookname, book.publisher, book.publicationdate, book.booktype, book.stockdate from bookinfo book
  70. # where book.publicationdate <'2009'
  71. publicationdate = '2009'
  72. print("db.session.query(BookInfo).filter(BookInfo.publicationdate<publicationdate).all()")
  73. queryinfo = db.session.query(BookInfo).filter(BookInfo.publicationdate < publicationdate).all()
  74. for i in queryinfo:
  75. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  76. print('----------------单表+单字段查询+in查询------------------')
  77. # select book.isbnno, book.bookname, book.publisher, book.publicationdate, book.booktype, book.stockdate from bookinfo book
  78. # where book.isbnno in ('ISBN0001','ISBN0003','ISBN0005','ISBN0007')
  79. print('db.session.execute(sql1)')
  80. isbnnolist = ['ISBN0001', 'ISBN0003', 'ISBN0005', 'ISBN0007']
  81. # sql = "select * from bookinfo where isbnno in ({})".format(','.join(map(str,isbnnolist)))
  82. # select * from bookinfo where isbnno in (ISBN0001,ISBN0003,ISBN0005,ISBN0007)
  83. sql = 'select * from bookinfo where isbnno in ({isbnnolist})'.format(isbnnolist=', '.join("'" + item + "'" for item in isbnnolist))
  84. # select * from bookinfo where isbnno in ('ISBN0001', 'ISBN0003', 'ISBN0005', 'ISBN0007')
  85. queryinfo = db.session.execute(sql)
  86. for i in queryinfo:
  87. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  88. print('db.session.execute(sql2)')
  89. isbnnolist = ('ISBN0001', 'ISBN0003', 'ISBN0005', 'ISBN0007')
  90. sql = 'select * from bookinfo where isbnno in {}'.format(isbnnolist)
  91. # select * from bookinfo where isbnno in ('ISBN0001', 'ISBN0003', 'ISBN0005', 'ISBN0007')
  92. queryinfo = db.session.execute(sql)
  93. for i in queryinfo:
  94. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  95. # print('db.session.execute(sql3)')
  96. # isbnnolist = ('ISBN0001', 'ISBN0003', 'ISBN0005', 'ISBN0007')
  97. # sql = 'select * from bookinfo where isbnno in (:isbnnolist)'
  98. # params={'isbnnolist':['ISBN0001', 'ISBN0003', 'ISBN0005', 'ISBN0007']}
  99. #
  100. # # select * from bookinfo where isbnno in ('ISBN0001', 'ISBN0003', 'ISBN0005', 'ISBN0007')
  101. # queryinfo = db.session.execute(sql,params)
  102. # for i in queryinfo:
  103. # print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  104. print('BookInfo.query.filter(BookInfo.isbnno in isbnnolist)') ################
  105. isbnnolist = ('ISBN0001', 'ISBN0003', 'ISBN0005', 'ISBN0007')
  106. queryinfo = BookInfo.query.filter(BookInfo.isbnno in (isbnnolist,))
  107. # queryinfo = BookInfo.query.filter(BookInfo.isbnno in (isbnnolist))
  108. for i in queryinfo:
  109. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  110. isbnnolist=['ISBN0001','ISBN0003','ISBN0005','ISBN0007']
  111. print("BookInfo.query.filter(BookInfo.isbnno.in_(isbnnolist)).all()")
  112. queryinfo = BookInfo.query.filter(BookInfo.isbnno.in_(isbnnolist)).all()
  113. for i in queryinfo:
  114. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  115. print("db.session.query(BookInfo).filter(BookInfo.isbnno.in_(isbnnolist)).all()")
  116. queryinfo = db.session.query(BookInfo).filter(BookInfo.isbnno.in_(isbnnolist)).all()
  117. for i in queryinfo:
  118. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  1. print('----------------单表+多字段查询------------------')
  2. # --单表查询,多字段查询1
  3. # select book.isbnno, book.bookname, book.publisher, book.publicationdate, book.booktype, book.stockdate from bookinfo book
  4. # where book.isbnno =? and book.bookname like ? and book.publisher like ? and book.bookstockdate>?
  5. # order by book.isbnno
  6. publisher1 = '机械工业出版社'
  7. publisher2 = '电力出版社'
  8. stockdate1='2021-07-01'
  9. stockdate2 = '2021-07-01'
  10. print('BookInfo.query.filter(*book_filter).all()')
  11. book_filter = {
  12. or_(
  13. and_(
  14. BookInfo.publisher == publisher1,
  15. BookInfo.stockdate > stockdate1
  16. ),
  17. and_(
  18. BookInfo.publisher.like('%' + publisher2 + '%'),
  19. BookInfo.stockdate > stockdate2
  20. )
  21. )
  22. }
  23. queryinfo=BookInfo.query.filter(*book_filter).all()
  24. for i in queryinfo:
  25. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  26. print('db.session.query(BookInfo.isbnno, BookInfo.bookname, BookInfo.publisher...).filter(*book_filter).all()')
  27. queryinfo = db.session.query(BookInfo.isbnno, BookInfo.bookname, BookInfo.publisher, BookInfo.publicationdate,
  28. BookInfo.booktype, BookInfo.stockdate).filter(*book_filter).all()
  29. for i in queryinfo:
  30. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  31. print('db.session.execute(sql, params)')
  32. publisher1 = '机械工业出版社'
  33. publisher2 = '%电力出版社%'
  34. stockdate1 = '2021-07-01'
  35. stockdate2 = '2021-07-01'
  36. sql = 'select * from bookinfo where (publisher = :publisher1 and stockdate>:stockdate1) or (publisher like :publisher2 and stockdate>:stockdate2)'
  37. params = {'publisher1': publisher1,
  38. 'publisher2': publisher2,
  39. 'stockdate1': stockdate1,
  40. 'stockdate2': stockdate2}
  41. queryinfo = db.session.execute(sql, params)
  42. for i in queryinfo:
  43. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  44. publisher = '邮电出版社'
  45. stockdate = '2021-07-11'
  46. # stockdate = ''
  47. bookname = ''
  48. print('db.session.query(BookInfo.isbnno, BookInfo.bookname,..).filter(')
  49. from sqlalchemy import text
  50. queryinfo=db.session.query(BookInfo.isbnno, BookInfo.bookname, BookInfo.publisher, BookInfo.publicationdate,
  51. BookInfo.booktype, BookInfo.stockdate).filter(
  52. BookInfo.publisher.contains(publisher) if publisher is not None else text("") , # like %邮电出版社%
  53. BookInfo.bookname.contains(bookname) if bookname is not None else text(""), # like %
  54. BookInfo.stockdate>=stockdate if stockdate!='1900-01-01' else text("") #>'2021-07-11'
  55. ).all()
  56. for i in queryinfo:
  57. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate)
  1. print('----------------多表+多字段查询------------------')
  2. # --多表查询,多字段查询1
  3. # 实现目标
  4. # select distinct book.isbnno, book.bookname, book.publisher, book.publicationdate, book.booktype, book.stockdate,
  5. # bookstock.purchasenum, bookstock.stocknum,
  6. # author.authorid, author.authorname, author.authorcard, author.authornationality
  7. # from bookinfo book,bookstockinfo bookstock,bookauthorinfo bookauthor,authorinfo author
  8. # where book.isbnno=bookstock.isbnno and book.isbnno=bookauthor.isbnno and bookauthor.authorid=author.authorid
  9. # book.isbnno =? and book.bookname like ? and book.publisher like ? and book.bookstockdate>?
  10. # and author.authorname like ? and author.authornationality like ?
  11. # order by book.isbnno
  12. book_filter = {
  13. or_(
  14. and_(
  15. BookInfo.isbnno.in_(['ISBN0001','ISBN0003','ISBN0005','ISBN0007']),
  16. BookInfo.publisher.ilike('%电子工业出版社%')
  17. )
  18. )
  19. }
  20. queryinfo=db.session.query(BookInfo.isbnno, BookInfo.bookname, BookInfo.publisher, BookInfo.publicationdate, BookInfo.booktype, BookInfo.stockdate,
  21. BookStockInfo.purchasenum, BookStockInfo.stocknum)\
  22. .join(BookStockInfo,BookInfo.isbnno==BookStockInfo.isbnno)\
  23. .join(BookAuthorinfo,BookInfo.isbnno==BookAuthorinfo.isbnno)\
  24. .join(AuthorInfo,BookAuthorinfo.authorid==AuthorInfo.authorid).filter(*book_filter).distinct()#.all()
  25. # query.join(BookStockInfo, BookInfo.isbnno==BookStockInfo.isbnno) # explicit condition
  26. # query.join(BookInfo.isbnno) # specify relationship from left to right
  27. # query.join(BookStockInfo, BookInfo.isbnno) # same, with explicit target
  28. # query.join('bookstockinfo') # same, using a string
  29. # SELECT DISTINCT bookinfo.isbnno AS bookinfo_isbnno, bookinfo.bookname AS bookinfo_bookname, bookinfo.publisher AS bookinfo_publisher,
  30. # bookinfo.publicationdate AS bookinfo_publicationdate, bookinfo.booktype AS bookinfo_booktype, bookinfo.stockdate AS bookinfo_stockdate,
  31. # bookstockinfo.purchasenum AS bookstockinfo_purchasenum, bookstockinfo.stocknum AS bookstockinfo_stocknum
  32. # FROM bookinfo JOIN bookstockinfo ON bookinfo.isbnno = bookstockinfo.isbnno
  33. # JOIN bookauthorinfo ON bookinfo.isbnno = bookauthorinfo.isbnno
  34. # JOIN authorinfo ON bookauthorinfo.authorid = authorinfo.authorid
  35. # WHERE bookinfo.isbnno IN ([POSTCOMPILE_isbnno_1])
  36. # AND lower(bookinfo.publisher) LIKE lower(?)
  37. for i in queryinfo:
  38. print(i.isbnno, i.bookname, i.publisher, i.publicationdate, i.booktype, i.stockdate,i.purchasenum,i.stocknum)
  39. # --多表查询,多字段查询2
  40. # 实现目标
  41. # select borrowerinfo.borrowername,borrowerinfo.address, borrowerinfo.telephone, borrowerinfo.registerdate,
  42. # book.isbnno, book.bookname, book.publisher, book.publicationdate, book.booktype, book.stockdate,
  43. # borrowerbook.borrowbookid,borrowerbook.borrowerid,borrowerbook.isbnno,borrowerbook.borrowdate,borrowerbook.returndate,borrowerbook.returnflag
  44. # from borrowerbook borrowerbook
  45. # left outer join bookinfo book
  46. # on borrowerbook.isbnno=book.isbnno
  47. # left outer join borrowerinfo borrowerinfo
  48. # on borrowerbook.borrowerid=borrowerinfo.borrowerid
  49. # and book.isbnno =?
  50. # and book.bookname like ?
  51. # and book.bookstockdate>?
  52. # and borrowerinfo.borrowername = ?
  53. isbnno = '机械工业出版社'
  54. bookname = '电力出版社'
  55. bookstockdate = '2021-07-01'
  56. borrowername = '2021-07-01'
  57. print('BookInfo.query.filter(*book_filter).all()')
  58. book_filter = {
  59. or_(
  60. and_(
  61. BookInfo.publisher.ilike('%'),
  62. BookInfo.stockdate > stockdate1
  63. ),
  64. and_(
  65. BookInfo.publisher.like('%' + publisher2 + '%'),
  66. BookInfo.stockdate > stockdate2
  67. )
  68. )
  69. }
  70. queryinfo = db.session.query(BorrowerInfo.borrowername,BorrowerInfo.birthday,BorrowerInfo.address,
  71. BookInfo.isbnno, BookInfo.bookname, BookInfo.publisher, BookInfo.publicationdate,
  72. BorrowerBook.borrowdate, BorrowerBook.returndate, BorrowerBook.returnflag) \
  73. .outerjoin(BorrowerInfo, BorrowerBook.borrowerid == BorrowerInfo.borrowerid) \
  74. .outerjoin(BookInfo, BorrowerBook.isbnno == BookInfo.isbnno) \
  75. .filter(*book_filter) # .all()
  76. # SELECT borrowerinfo.borrowername AS borrowerinfo_borrowername, borrowerinfo.birthday AS borrowerinfo_birthday, borrowerinfo.address AS borrowerinfo_address,
  77. # bookinfo.isbnno AS bookinfo_isbnno, bookinfo.bookname AS bookinfo_bookname, bookinfo.publisher AS bookinfo_publisher, bookinfo.publicationdate AS bookinfo_publicationdate,
  78. # borrowerbook.borrowdate AS borrowerbook_borrowdate, borrowerbook.returndate AS borrowerbook_returndate, borrowerbook.returnflag AS borrowerbook_returnflag
  79. # FROM borrowerbook
  80. # LEFT OUTER JOIN borrowerinfo
  81. # ON borrowerbook.borrowerid = borrowerinfo.borrowerid
  82. # LEFT OUTER JOIN bookinfo
  83. # ON borrowerbook.isbnno = bookinfo.isbnno
  84. # WHERE bookinfo.publisher = ? AND bookinfo.stockdate > ? OR bookinfo.publisher LIKE ? AND bookinfo.stockdate > ?
  85. for i in queryinfo:
  86. print(i.borrowername,i.birthday,i.address,
  87. i.isbnno, i.bookname, i.publisher, i.publicationdate,
  88. i.borrowdate, i.returndate, i.returnflag)

4204b2fb175e2f7488579904c6e9d1b2.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/788246
推荐阅读
相关标签
  

闽ICP备14008679号