SQLite3使用非常广,我们的android系统和ios系统都是使用的这个数据库
1、项目的目录结构如下:
实现一个注册成功跳转到登录页面,并且把注册的用户名和邮箱地址插入数据库,在list路径下执行删除操作,同时删除对应的数据库记录
2、models.py文件中主要实现sqlite3数据库的增删改查函数/方法,初始化数据库(init_db())也就是创建数据库表的操作只有第一次没有表的时候需要执行,表创建成功后就不需要再执行初始化数据库的代码了,models代码如下
#models.py
import sqlite3
DB_FILES='db/database.sqlite3' #需要在当前项目的根目录下新建一个db空文件夹
#初始化数据库函数
def init_db():
#创建数据库连接
conn=sqlite3.connect(DB_FILES)
try:
sql="""
create table if not exists users(
username text primary key,
password text,
email text)
"""
conn.execute(sql)
print("数据库初始化成功")
except:
print("数据库初始化失败")
finally:
conn.close()
#查询所有数据函数
def find_all():
list=[]
conn = sqlite3.connect(DB_FILES)
try:
#创建游标
cursor=conn.cursor()
sql = """
select username,password,email from users
"""
cursor.execute(sql)
#提取结果集
result_set=cursor.fetchall()
for row in result_set:
dict={}
dict['username']=row[0]
dict['password'] = row[1]
dict['email'] = row[2]
list.append(dict)
print("数据查询成功")
except:
print("数据查询失败")
finally:
conn.close()
return list
#插入数据函数
def create(user):
#
conn = sqlite3.connect(DB_FILES)
try:
cursor=conn.cursor()
sql = """
insert into users(username,password,email) values(?,?,?)
"""
afcount=cursor.execute(sql,[user['username'],user['password'],user['email']])
#提交结果集
conn.commit()
print("数据插入成功")
except:
print("数据插入失败")
#回滚事物,保证插入的原子性
conn.rollback()
finally:
conn.close()
#删除数据
def remove(username):
#
conn = sqlite3.connect(DB_FILES)
try:
cursor = conn.cursor()
sql = "DELETE FROM users WHERE username = ?"
afcount = cursor.execute(sql,[username])
# 提交结果集
conn.commit()
except:
print("数据删除失败")
# 回滚事物,保证插入的原子性
conn.rollback()
finally:
conn.close()
3、form.py文件中定义一个注册的类
#forms.py
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,validators
class RegistrationForm(FlaskForm):
username=StringField('用户名:',[validators.DataRequired('请输入用户名')]) #FlaskForm表单中的StirngField等可以渲染成HTML中的input标签
password = PasswordField('密码:', [validators.DataRequired('请输入密码')])
password2 = PasswordField('再次输入密码:', [validators.EqualTo('password',message='两次输入的密码不匹配')])
email = StringField('邮箱:', [validators.DataRequired('请输入邮箱'),validators.Email('请输入有效的邮箱名')])
4、Hello.py文件:
#Hello.py
from flask import Flask,render_template,request,redirect,url_for
import models
from forms import RegistrationForm
app=Flask(__name__)
app.secret_key="12ewsddfd34frdfchfg" #必要的
@app.route('/login')
def login():
return render_template('login.html')
#初始化数据库
models.init_db()
@app.route('/register',methods=['GET','POST'])
def register():
form=RegistrationForm()
if request.method=='POST':
if form.validate():
user={}
user['username']=request.form['username'] #request.form['username']中的usernamne是我们在页面中输入的username赋值给数据库表user中的username字段
user['password'] = request.form['password']
user['email'] = request.form['email']
# 调用models.py中的create()函数插入数据库
models.create(user)
return redirect(url_for('login'))
else:
return render_template('registration.html',form=form)
return render_template('registration.html',form=form)
@app.route('/list')
def show_list():
#调用models.py中的find_all()函数查询
list=models.find_all()
return render_template('user_list.html', list=list)
@app.route('/del')
def remove_user():
username=request.args['username']
#调用models.py中的remove函数删除数据
models.remove(username)
#查询所有数据
list=models.find_all()
return render_template('user_list.html', list=list)
if __name__=='__main__':
app.run(debug=True)
5、模板文件,这里面用到了jinjia2模板的继承,把每个html页面都有的部分定义成base.html模板,不同的部分在各自的模板中自己定义,下面的login.html\registration.html\user_list.html都继承了base.html页面
(1)base.html
{% block title%}{% endblock %}
智捷网上电脑商城
{% block body%}{% endblock %}
(2)login.html
{% extends "base.html"%}
{% block title %}用户登录{% endblock %}
{% block body %}
你已经注册成功,进入登录页面了,登录页面具体实现一会儿写吧!
{% endblock%}
(3)user_list.html
{% extends "base.html"%}
{% block title %}用户列表{% endblock %}
{% block body %}
用户名
邮箱
操作
{% for row in list %}
{{row['username']}}
{{row['email']}}
修改
删除
{% endfor %}
{% endblock%}
(4) registration.html
{% extends "base.html"%}
{% block title %}用户注册{% endblock %}
{% block body %}
{% for errors in form.errors.items()%}
{% for message in errors%}
-
{{message}}
{% endfor %}
{% endfor %}
{% endblock%}
执行Hellol.py代码,在控制台看见”数据库初始化成功“的字样,在db文件夹下生成一个database.sqlite3数据,此时这个库是空的,执行init_db()函数后会创建一个user空表,接着对应代码,对数据库进行插入、查询、删除等操作
register页面
注册成功后,跳转到登录页面,同时数据中多出一条数据:
list页面:
SQLALchemy框架:
ORM(Object ralation map):每个一数据库的表对应一个类,表中的每个字段对应类中的变量,表中的一条记录对应类的一个实例。
SQLALchemy是一种ORM技术:
将上面的sqlite3改成sqlalchemy框架,models.py的代码如下:
#models.py
from sqlalchemy import Column,String,Integer,Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
DB_FILES='db/database.sqlite3' #需要在当前项目的根目录下新建一个db空文件夹
engine=create_engine('sqlite:///'+DB_FILES,echo=True)
#创建模型基类
Base=declarative_base()
#定义User模型
class User(Base):
__tablename__='users' #users数据库中表的表名
name=Column('username',String(100),primary_key=True) #name是我们User模型中的字段名,username是users表的表名
password=Column('password',String(100))
email=Column('email',String(50))
if __name__=='__main__':
#创建数据库中的表
Base.metadata.create_all(engine) #第一次需要运行这句代码创建数据库中的表,后面就不需要再运行改代码了
#查询所有数据函数
def find_all():
#创建Session对象
Session=sessionmaker(bind=engine)
session=Session()
#查询返回列表
list=session.query(User).all()
list2=[] #返回视图的数据类型
for user in list:
dict={}
dict['username']=user.name
dict['password'] =user.password
dict['email'] = user.email
list2.append(dict)
#关闭session
session.close()
return list2
#插入数据函数
def create(user):
# 创建Session对象
Session = sessionmaker(bind=engine)
session = Session()
new_user=User(name=user['username'],
password=user['password'],
email=user['email'])
#插入数据库
session.add(new_user)
#提交数据库事物
session.commit()
#关闭session
session.close()
#删除数据
def remove(username):
# 创建Session对象
Session = sessionmaker(bind=engine)
session = Session()
#查询要删除的用户
user=session.query(User).filter_by(name=username).one()
#删除用户
session.delete(user)
# 提交数据库事物
session.commit()
# 关闭session
session.close()
Hello.py文件中去掉初始化数据库的代码:models.init_db()其他的代码和html文件都不需要变化,运行hello.py文件,效果和上面一样!