Mysql.py,通过网页输入来实现数据库表的增删改查
from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from sqlalchemy import text
app = Flask(__name__)
HOSTNAME = 'localhost'
# HOSTNAME = '127.0.0.1',这俩就是一样的
PORT = 3306
USERNAME = 'root'
PASSWORD = '341533'
DATABASE = 'kafka'
app.config[
'SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
#这个db对象就包括了sqlalchemy和sqlalchemy.orm中的所有函数和助手
app.config['SQLALCHEMY_ECHO']=True
#加上这俄格就会在周围形成2大叔控1
db = SQLAlchemy(app)
with app.app_context():
# with app.app_context():就是应用上下文,这里必须要有,整个项目可以有多个
with db.engine.connect() as conn:
rs = conn.execute(text("select * from s"))
# text是必要的,这里似乎和sqlite3数据库那边有所不同,那边可以直接execute执行
for i in rs.fetchall():
print(i)
class User(db.Model):
__tablename__ = 'flask_one'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
# db.String(100)会映射成varchar(100),db.Integer就是int,nullable=False就是不为空
# autoincrement=True就是这个int类型会自增,
with app.app_context():
db.create_all()
# 这里的把全部orm模型类映射成mysql的对应数据库中的表,表名就是__tablename__,
# db.Model是所有的orm模型类的父类,必须直接或间接继承,类属性经过db.Column对象方法的赋值才能被映射成同名字段
# 我才发现这个app_id等这种后面的变量不在绑定的函数中用的话就会报错(不是形参就报错)
# 我发现连接同一个手机热点的多个设备,用的路由是一样的,这多个设备也都可以ping通这路由,但是不能互相ping通
# 当然,这多个设备都可以直接ping通这个手机的ip地址,
# 所以当我用手机热点给这个电脑连接的时候,(本来一般在同一个局域网就能互相访问)就可以用手机访问这个设置了host=‘0.0.0.0’的flask程序,当然要在电脑ip后面加上 :对应端口号
# 并且还可以修改保存,我在博客上已经验证过了,那个不同的手机热点连接下,电脑ip是不同的,由此形成的访问地址也不同,但是连接这个热点的另一个设备不能访问
@app.route("/add/<username>/<password>")
def add(username, password):
user1 = User(username=username, password=password)
db.session.add(user1)
db.session.commit()
return f"添加用户{username}成功"
#sessiton会话是临时工作区,可以存储处理当前操作,提交后,才会更新到数据库,否则当你不小心关闭会话或者会话超时,未提交的数据将会丢失
@app.route("/query_u/<username>")
def query_username(username):
flask_users = User.query.filter_by(username=username).all()
for user in flask_users:
print(f"{user.password}--{user.username}--{user.id}")
return render_template("query_u.html", flask_users=flask_users)
@app.route("/query_p/<password>")
def query_password(password):
flask_users = User.query.filter_by(password=password).all()
# flask_user = User.query.filter_by(password=password).first() 一个数据对象一般这模写,
for user in flask_users:
print(f"{user.password}--{user.username}--{user.id}")
return render_template("query_p.html", flask_users=flask_users)
@app.route("/query/all")
def query_all():
flask_users = User.query.all()
#类名加上的query.all()就是返回字典列表???
count=0
for flask_user in flask_users:
print(f"{flask_user.username}- {flask_user.password}-{flask_user.id}")
count+=1
return render_template("query_all.html", flask_users=flask_users,count=count)
@app.route("/query_id/<id>")
def query_id(id):
flask_user = User.query.get(id)
print(f"{flask_user.username}- {flask_user.password}-{flask_user.id}")
return f"根据主键查询数据成功{flask_user.username}- {flask_user.password}-{flask_user.id}"
@app.route("/change_name/<id>/<username>")
def change_u(username, id):
flask_user = User.query.get(id)
flask_user.username = username
db.session.commit()
return f"{id}所对应的对象username修改成功"
@app.route("/change_pwd/<id>/<password>")
def change_p(password, id):
flask_user = User.query.get(id)
flask_user.password = password
db.session.commit()
return (f"{id}所对应的对象password修改成功")
@app.route("/change_pwd/all/<password>")
def change_pall(password):
flask_users = User.query.all()
for user in flask_users:
user.password = password
db.session.commit()
return f"所有对象password修改成功"
@app.route("/change_name/all/<username>")
def change_uall(username):
flask_users = User.query.all()
for user in flask_users:
user.username = username
db.session.commit()
return f"所有对象username修改成功"
@app.route("/delete/<id>")
def deleteid(id):
flask_user = User.query.get(id)
db.session.delete(flask_user)
db.session.commit()
return f"主键{id}对应的{flask_user.username}已被删除"
@app.route("/delete/all")
def deleteall():
flask_users = User.query.all()
for i in flask_users:
db.session.delete(i)
db.session.commit()
return f"所有数据对象已被删除"
if __name__ == '__main__':
app.debug = True
app.run(host='0.0.0.0', port=5000)
# 数据库的会话回滚操作就是,撤销当前会话中所有未提交的事务,事务就是一堆有联系的要么一起执行成功,要么一起执行失败的sql语句,mysql中是用ROLLBACK函数
# 我的理解是会话是预执行,可以一次性提交,可以把获取的每一个对象都理解成一个字典
query_all.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for i in flask_users %}
<h3>{{i.username}}--- {{i.password}}---{{i.id}}</h3>
{% endfor %}
<h2>全查询成功,一共{{count}}个对象</h2>
</body>
</html>
query_p.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for i in flask_users %}
<h3>{{i.username}}--- {{i.password}}---{{i.id}}</h3>
{% endfor %}
</body>
</html>
query_u.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for i in flask_users %}
<h5>{{i.username}}--- {{i.password}}---{{i.id}}</h5>
{% endfor %}
</body>
</html>
Django报错:TemplateSyntaxError at / Invalid block tag: 'else', expected 'empty' or 'endfor'-CSDN博客
这个报错一开始没注意,那个%和{}之间不能有空格