当我们需要管理一些书籍时,我们可以利用Python和PostgreSQL来创建一些简单的操作系统,这样我们就可以轻松地管理我们的书籍库存了。
在这篇博客中,我将向您展示如何使用Python Flask框架和psycopg2库来创建一个简单的书籍库存管理系统。该系统可以实现以下操作:
显示所有书籍 添加一本书籍 删除一本书籍 借出一本书籍 还回一本书籍
首先,我们需要创建一个名为book的数据库来存储所有书籍的信息。我们可以使用以下代码在PostgreSQL中创建这个数据库:
CREATE DATABASE book;
现在,我们需要创建一个名为book的表来存储书籍的信息。表格将需要包含以下信息:书籍ID,书籍名称,书籍作者和书籍库存量。在PostgreSQL中,我们可以使用以下代码来创建这个表:
CREATE TABLE book(
bookid integer primary key,
bookname varchar(40) not null,
bookauther varchar(40) not null,
booksurplus integer not null
);
这个表格包含了书籍的ID、名称、作者和库存量。我们将使用这些信息来管理库存,并对书籍进行增加、删除、借出和还回的操作。
接下来,我们需要使用psycopg2库来连接到PostgreSQL数据库。我们需要创建一个名为connect_db()的函数,该函数将读取数据库的参数并返回一个数据库连接对象。
import psycopg2
def connect_db():
conn = psycopg2.connect(
host='localhost',
port='5432',
dbname='book',
user='postgres',
password='123456'
)
return conn
接下来,我们需要使用Flask框架来构建一个Web应用程序。我们将需要创建以下路由,以便能够与我们的数据库进行交互:
/: 显示主页 /show_all_book: 显示所有书籍 /del_book0: 显示删除书籍的页面 /del_book1: 执行删除书籍操作 /add_book0: 显示添加书籍的页面 /add_book1: 执行添加书籍操作 /out_book0: 显示借出书籍的页面 /out_book1: 执行借出书籍操作 /in_book0: 显示还回书籍的页面 /in_book1: 执行还回书籍操作 现在,让我们开始编写这些路由。首先,我们需要在app.py中导入Flask和render_template和request函数,这些函数将帮助我们构建Web应用程序。
from flask import Flask, render_template, request
app = Flask(__name__)
接下来,让我们创建主页路由。
@app.route('/')
def index():
return render_template('index.html')
我们将在templates文件夹中创建一个名为index.html的模板文件,该文件将在我们访问主页时被渲染。
接下来,让我们创建一个路由来显示所有的书籍。
@app.route('/show_all_book')
def show_all_book():
conn = connect_db()
cur = conn.cursor()
cur.execute("SELECT * FROM book")
rows = cur.fetchall()
return render_template('show_all_book.html',rows=rows)
table {
border-collapse: collapse;
width: 100%;
}
th, td {
text-align: left;
padding: 8px;
border-bottom: 1px solid #ddd;
}
th {
background-color: #4CAF50;
color: white;
}
图书馆所有藏书
图书ID | 图书名称 | 作者 | 余量 |
---|---|---|---|
{{ row[0] }} | {{ row[1] }} | {{ row[2] }} | {{ row[3] }} |
该路由将连接到数据库并获取所有书籍的信息。在获取所有的书籍信息后,我们将把它们传递到一个名为show_all_book.html的模板文件中,该模板文件将渲染所有书籍的信息。
接下来,让我们创建一个路由来删除一本书籍。
@app.route('/del_book0',methods=['POST','GET'])
def del_book0():
return render_template('del_book.html')
@app.route('/del_book1',methods=['POST','GET'])
def del_book1():
del_bookid = request.form.get('del_bookid')
del_bookname = request.form.get('del_bookname')
sql = f"DELETE FROM book WHERE bookid={del_bookid} "
conn = connect_db()
cur = conn.cursor()
cur.execute(sql)
conn.commit()
return render_template('del_book.html', msg=f"{del_bookname}删除成功!")
该路由将显示一个名为del_book.html的模板文件,该文件将要求用户输入要删除的书籍的信息。然后,当用户提交要删除的书籍信息时,我们将连接到数据库并执行一个名为DELETE FROM的SQL语句,从而删除该书籍。最后,我们将向用户显示一个成功或失败的消息。
接下来,让我们创建一个路由来添加一本书籍。
@app.route('/add_book0',methods=['POST','GET'])
def add_book0():
return render_template('add_book.html')
@app.route('/add_book1',methods=['POST','GET'])
def add_book1():
add_bookid = request.form.get('add_bookid')
add_bookname = request.form.get('add_bookname')
add_bookauther = request.form.get('add_bookauther')
add_booksurplus= request.form.get('add_booksurplus')
sql=f"INSERT INTO book VALUES ({add_bookid},'{add_bookname}','{add_bookauther}',{add_booksurplus})"
conn=connect_db()
cur=conn.cursor()
cur.execute(sql)
conn.commit()
return render_template('add_book.html',msg=f"{add_bookname}添加成功!")
该路由将显示一个名为add_book.html的模板文件。在该文件中,用户可以输入一本书籍的信息,并提交表单以将信息添加到数据库中。当用户提交表单时,我们将连接到数据库并执行一个名为INSERT INTO的SQL语句,以将书籍添加到数据库中。最后,我们将向用户显示一个成功或失败的消息。
接下来,让我们创建一个路由来借出一本书籍。
@app.route('/out_book0',methods=['POST','GET'])
def out_book0():
return render_template('out_book.html')
@app.route('/out_book1',methods=['POST','GET'])
def out_book1():
out_bookid=request.form.get('out_bookid')
out_bookname = request.form.get('out_bookname')
sql=f"select book.booksurplus from book where bookid={out_bookid}"
conn=connect_db()
cur=conn.cursor()
cur.execute(sql)
surplus=cur.fetchall()
conn.commit()
if surplus[0][0] >0:
sql=f"update book set booksurplus=booksurplus-1 where bookid={out_bookid}"
conn=connect_db()
cur=conn.cursor()
cur.execute(sql)
conn.commit()
return render_template('out_book.html',msg=f"{out_bookname}成功借出,{out_bookname}还剩下{surplus[0][0]}本。")
else:
return render_template('out_book.html',msg=f"抱歉!{out_bookname}库存不足!")
该路由将显示一个名为out_book.html的模板文件,该文件将要求用户输入要借出的书籍的信息。当用户提交表单时,我们将连接到数据库并首先检查该书籍库存是否足够。如果库存充足,我们将执行一个名为update book set的SQL语句,将该书籍的库存减1,并向用户显示一个成功消息。如果库存不足,我们将向用户显示一个失败消息。
最后,让我们创建一个路由来还回一本书籍。
@app.route('/in_book0',methods=['POST','GET'])
def in_book0():
return render_template('in_book.html')
@app.route('/in_book1',methods=['POST','GET'])
def in_book1():
in_bookid=request.form.get('in_bookid')
in_bookname = request.form.get('in_bookname')
sql=f"update book set booksurplus=booksurplus+1 where bookid={in_bookid}"
conn=connect_db()
cur=conn.cursor()
cur.execute(sql)
conn.commit()
sql = f"select book.booksurplus from book where bookid={in_bookid}"
conn = connect_db()
cur = conn.cursor()
cur.execute(sql)
surplus = cur.fetchall()
conn.commit()
return render_template('in_book.html',msg=f"{in_bookname}成功还回,{in_bookname}还剩下{surplus[0][0]}本。")
在这篇博客中,我们学习了如何使用Python Flask和PostgreSQL实现基本的书籍库存管理系统。我们分别实现了展示所有书籍、删除书籍、添加书籍、借出书籍和归还书籍等功能的路由。
在实现这些功能之前,我们首先创建了一个名为book的数据库并设计了一个包含书籍ID、书名、作者名和库存数量的book表。然后,我们实现了一个connect_db函数来连接到这个数据库。
接下来,我们实现了展示所有书籍、删除书籍和添加书籍的路由。在这些路由中,我们使用了SQL语句并通过connect_db函数连接到了database。 在借出书籍和还回书籍的路由中,我们也使用了SQL语句,但除了执行UPDATE和SELECT语句之外,我们还使用了request.form.get函数来获取表单中用户输入的数据,并使用render_template函数来渲染包含成功消息的HTML模板。
总之,通过这篇博客,我们可以了解到使用Python Flask与数据库结合,可以很容易地创建一个简单易用的书籍库存管理系统,帮助用户快速处理图书馆等场合的库存管理问题。
目录结构:
├── app.py
├── static
│ ├── css
│ └── js
└── templates
├── add_book.html
├── del_book.html
├── index.html
├── in_book.html
├── out_book.html
└── show_all_book
完整代码:
import psycopg2
from flask import Flask, render_template, request
app = Flask(__name__)
def connect_db():
conn = psycopg2.connect(
host='localhost',
port='5432',
dbname='book',
user='postgres',
password='123456'
)
return conn
@app.route('/')
def index():
return render_template('index.html')
@app.route('/show_all_book')
def show_all_book():
conn = connect_db()
cur = conn.cursor()
cur.execute("SELECT * FROM book")
rows = cur.fetchall()
return render_template('show_all_book.html',rows=rows)
@app.route('/del_book0',methods=['POST','GET'])
def del_book0():
return render_template('del_book.html')
@app.route('/del_book1',methods=['POST','GET'])
def del_book1():
del_bookid = request.form.get('del_bookid')
del_bookname = request.form.get('del_bookname')
sql = f"DELETE FROM book WHERE bookid={del_bookid} "
conn = connect_db()
cur = conn.cursor()
cur.execute(sql)
conn.commit()
return render_template('del_book.html', msg=f"{del_bookname}删除成功!")
@app.route('/add_book0',methods=['POST','GET'])
def add_book0():
return render_template('add_book.html')
@app.route('/add_book1',methods=['POST','GET'])
def add_book1():
add_bookid = request.form.get('add_bookid')
add_bookname = request.form.get('add_bookname')
add_bookauther = request.form.get('add_bookauther')
add_booksurplus= request.form.get('add_booksurplus')
sql=f"INSERT INTO book VALUES ({add_bookid},'{add_bookname}','{add_bookauther}',{add_booksurplus})"
conn=connect_db()
cur=conn.cursor()
cur.execute(sql)
conn.commit()
return render_template('add_book.html',msg=f"{add_bookname}添加成功!")
@app.route('/out_book0',methods=['POST','GET'])
def out_book0():
return render_template('out_book.html')
@app.route('/out_book1',methods=['POST','GET'])
def out_book1():
out_bookid=request.form.get('out_bookid')
out_bookname = request.form.get('out_bookname')
sql=f"select book.booksurplus from book where bookid={out_bookid}"
conn=connect_db()
cur=conn.cursor()
cur.execute(sql)
surplus=cur.fetchall()
conn.commit()
if surplus[0][0] >0:
sql=f"update book set booksurplus=booksurplus-1 where bookid={out_bookid}"
conn=connect_db()
cur=conn.cursor()
cur.execute(sql)
conn.commit()
return render_template('out_book.html',msg=f"{out_bookname}成功借出,{out_bookname}还剩下{surplus[0][0]}本。")
else:
return render_template('out_book.html',msg=f"抱歉!{out_bookname}库存不足!")
@app.route('/in_book0',methods=['POST','GET'])
def in_book0():
return render_template('in_book.html')
@app.route('/in_book1',methods=['POST','GET'])
def in_book1():
in_bookid=request.form.get('in_bookid')
in_bookname = request.form.get('in_bookname')
sql=f"update book set booksurplus=booksurplus+1 where bookid={in_bookid}"
conn=connect_db()
cur=conn.cursor()
cur.execute(sql)
conn.commit()
sql = f"select book.booksurplus from book where bookid={in_bookid}"
conn = connect_db()
cur = conn.cursor()
cur.execute(sql)
surplus = cur.fetchall()
conn.commit()
return render_template('in_book.html',msg=f"{in_bookname}成功还回,{in_bookname}还剩下{surplus[0][0]}本。")
if __name__ == '__main__':
app.run()
好文链接
发表评论