在Day2中,我们实现了书目检索系统的初步构建。在实际生活中,如果我们需要从数据库调取大量的书本数据展示在网页上,是不可能一本书一本书写上去的,我们需要用到循环。
我在数据库中创建了几张表:
首先,我们需要对数据库进行连接,这样才能从中获取数据。
数据库连接的python代码模板:
import pymysql
#一、连接数据库的四个要素
hostName="localhost"
userName="root" #数据库连接的用户名
userPassword="root" #数据库连接的密码
dbName="imdpython" #数据库的名字
#二、使用pymysql的connect方法连接mysql
db=pymysql.connect(hostName,userName,userPassword,dbName)
#三、我们需要一个游标,获取数据更快
_cursor=db.cursor()
#四、 编写SQL(你可以编写任意sql语句)
#sql="select a.book_bname,a.author,b.publish from imd_book a left join imd_publish b on a.publisher=b.publish_id"
#sql = "select * from imd_book"
#sql="insert into imd_book(book_bname,publisher,author,publish_date,isbn) values('知识图谱',2,'嘉欣','2009-9-11','112XXX112')"
#sql="update imd_book set book_bname='诗经解析' where book_bname='知识图谱'"
#sql="delete from imd_book WHERE book_id>10"
#五、在try异常里执行SQL
try:
_cursor.execute(sql)
#六、获取数据
results=_cursor.fetchall()
#七、循环显示数据
for row in results: #想读取数出数据时可以用这个循环输出
print(row[3])
except:
print('出错啦');
#八、关闭数据库
db.close()
第二步,我们可以把这个数据库连接的代码放进先前编辑好的.py代码中:
from flask import Flask,render_template
import pymysql
app=Flask(__name__)
@app.route("/lib")
def index():
#一、 连接数据库的四个要素(端口号默认)
hostName = "localhost"
userName = "root"
userPassword = "root"
dbName = "imdpython"
# 二、使用Pymysql的connect方法连接mysql
db = pymysql.connect(hostName, userName, userPassword, dbName)
# 三、我们需要一个游标(负责找数据)
_cursor = db.cursor()
# 四、编写SQL
sql = "select * from imd_book"
# 五、执行sql
try:
_cursor.execute(sql)
#六、 获取数据
results = _cursor.fetchall()
# 七、循环显示数据
for row in results:
print(row[3])
except:
print('出错啦');
# 关闭数据库
db.close()
return render_template('lib.html',dataList=results) #这里将传递一组数据给lib.html,注意在html中变量的标号要与相应字段名的位置对应
if __name__=='__main__':
app.run(host="0.0.0.0")
lib.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>书目检索系统</title>
<link rel="icon" href="{{url_for('static',filename='images/tubiaoqian.ico')}}" type="image/x-icon"/>
<style type="text/css">
span{
color:purple;
}
</style>
</head>
<body>
<img width="150" src="{{url_for('static',filename="images/tu1.jpeg")}}"/>
<h1><span style='color:darkblue'><strong>书目检索系统</strong></span></h1>
<form action="save.php" method="post" >
<label>书籍种类:</label>
<select>
<option value="全部">全部</option>selected="selected"
<option value="教材">教材</option>
<option value="期刊">期刊</option>
<option value="文学">文学</option>
<option value="法律">法律</option>
<option value="政治">政治</option>
<option value="小说">小说</option>
<option value="金融">金融</option>
<option value="科技">科技</option>
<option value="其他">其他</option>
</select>
<form method="post" action="">
<table>
<tr>
<td><select id="">
<option value="1"
selected="selected">题名</option>
<option value="2">出版社</option>
</select></td>
<td><input type="text" id=""/></td>
<td><input value="查询" type="submit"/>
<input type="reset" value="重置" /></td>
</tr>
</table>
</form>
<table>
{% for r in dataList%} #这里使用循环逐条获取imd_book表中的数据:书名、出版社、作者等
<tr>
<td colspan="3">{{r[2]}}</td> #注意标号2与imd_book表中的相应字段的位置对应
</tr>
<tr>
<td>
<img width="60" src="{{url_for('static',filename="images/gaodengshuxue.jpg")}}">
</td>
<td>
<ul>
<li>{{r[5]}}</li>
<li>{{r[1]}}</li>
</ul>
</td>
<td>
<ul>
<li><span>馆藏书本:</span>9</li> #由于imd_book表中没有关于馆藏总数的信息,暂且随意取值,稍后再讲如何统计馆藏书本
<li><span>可借书本:</span>5</li> #同上
</ul>
</td>
</tr>
{%endfor%} #循环结束
</table>
</body>
</html>
运行后可以发现,我们imd_book表中所有的书本及其对应的出版社、书名均展示出来了。(除了图片、馆藏总数、馆藏可借是固定值)
接下来,为了统计馆藏总数、馆藏可借总数,我们只需要改变sql语句、获取数据的方式,并在html中为其添加变量即可。
变更代码如下:
try:
_cursor.execute(sql) # 执行SQL
results = _cursor.fetchall() #获取多条记录
datalist = []
for row in results: #每一轮,row获取imd_book中的一条记录,row[i]代表第i列的数据
_one = []
_one.append(row[0])
_one.append(row[1])
_one.append(row[2])
_one.append(row[3])
_one.append(row[4])
sql1 = "select count(*) from imd_copybook where book_id= %s"
sql2 = "select count(*) from imd_copybook where is_borrow=1 and status=1 and book_id=%s"#is_borrow=1表示可借,status=1表示在馆
print(sql1)
print(sql2)
print(row[3])
_cursor.execute(sql1,(row[0],))
# 获取数据
results1 = _cursor.fetchone()
_one.append(results1[0])
print(results1[0])
_cursor.execute(sql2,(row[0],))
# 获取数据
results2 = _cursor.fetchone()
_one.append(results2[0])
print(results2[0])
datalist.append(_one) #datalist相当于得到了一条带有馆藏总数和馆藏记录的记录
except:
print('出错啦')
运行结果: