要实现数据库存储用户资料,首先要建立一个数据库文件,并建立对应的表来存储对应的用户资料
我们先建立一个简单的数据库,里面只存储了用户的用户名和密码。
我们用python里自带的sqlite3来建立一个数据库
新建一个python文件:create_sql.py
代码:----------------------------------------------------------------
#coding:utf-8
import sqlite3
#建一个数据库
def create_sql():
sql = sqlite3.connect("user_data.db")
sql.execute(
"""create table if not exists
%s(
%s integer primary key autoincrement,
%s varchar(128),
%s varchar(128))"""
% ('user',
'id',
'name',
'passworld'))
sql.close()
return sql
#user_data.db为数据库文件名
#create table if not exists为建立一个数据库指令,如果文件存在就打开,不存在就创建一个
#%s对应后面的四个参数
# 'user':表名
# 'id':相当于一个索引,autoincrement指定为自动增量
# 'name',用户名
# 'passworld'用户密码
# sql.close()是关闭数据库,每次对数据库进行操作后,都要记得进行关闭操作
create_sql()
运行
$python create_sql.py
运行成功后,在当前目录下会生成"user_data.db"文件
就是我们要用到的数据库文件,当然你也可以用sqlite3来生成这个文件
这个数据库现在还不包含任何的用户资料,如果用表格来表达这个数据库大约就是如下
file:user_data.db
table:user
id name passworld
有了数据库,我们就要向数据库增加用户资料
新建一个python
add_data.py
代码:--------------------------------------------------------------------------------
#coding:utf-8
import sqlite3
#数据库增加数据
def add_data():
sql = sqlite3.connect("user_data.db")
sql.execute("insert into user(name,passworld) values('python','147258369')")
sql.commit()
print "添加成功"
sql.close() # 关闭数据库
#sqlite3.connect("user_data.db")要增加一条用户资料,首先要打开数据库文件
#"insert into user(name,passworld) values('python','147258369')"是sqlite3指令
#它表示在表'user'的name对应的列写入一行python,就是用户名,在passworld对应的列写入一行147258369,就是用户密码
#做完这一步之后,对数据库的操作已经完成,但user_data.db这个文件是还没有发生变化的
#sql.commit()提交任务,只有使用了commit()方法后,才会把之前对数据库的操作写入文件中,
# sql.close()是关闭数据库,每次对数据库进行操作后,都要记得进行关闭操作
add_data()
这里不用运行这段代码,这里只是为说明如何在数据库中增加数据
这段代码过于简单,如果我们想要自定义输入用户名和密码就只能修改代码内的
values('python','147258369')字段,比较不方便
所以,为了以后方便地对数据库进行增加和查询,在上面的基础上,另外建立一个python
data_operations.py
代码:---------------------------------------------------------------------
#coding:utf-8
import sqlite3
#数据库增加数据
def add_data():
input_name = str(raw_input("请输入您的用户名:"))
input_passworld = str(raw_input("请输入您的密码:"))
sql = sqlite3.connect("user_data.db")
sql.execute("insert into user(name,passworld) values(?,?)",
(input_name,input_passworld))
sql.commit()
print "添加成功"
sql.close()
#这里增加了读取两个参数values(?,?)字段里的两个?号,对应了参数input_name,input_passworld
def showalldata():
sql = sqlite3.connect("user_data.db")
data=sql.execute("select * from user").fetchall()
sql.close()
return data
#"select * from user"为查询user对应的表的所有资料的指令
while 1:
option= """
1:增加数据
2:查询数据
q:退出
选择您想要的进行的操作:"""
cho = raw_input(option)
if cho=='1':
add_data()
elif cho=='2':
showalldata()
elif cho=='q':
break
else:
"输入错误"
我们现在要做的是实现注册一个新的用户,并用户名只能为唯一
比如,这个假定的数据库已经有一个用户,名为python,当我们新注册用同样的用户名时,会要求重新输入
建立python文件:register.py
代码:--------------------------------------------------------
#coding:utf-8
import sqlite3
#数据库增加数据
def register():
while 1:
input_name = str(raw_input("请输入您的用户名:"))
sql = sqlite3.connect("user_data.db")
data = sql.execute("select * from user where name='%s'" % input_name).fetchone()
if not data:
input_passworld = str(raw_input("请输入您的密码:"))
sql.execute("insert into user(name,passworld) values(?,?)",
(input_name,input_passworld))
sql.commit()
print "添加成功"
sql.close()
break
else:
print "用户已存在"
register()
运行:
$python register.py
请输入您的用户名:python
用户已存在
请输入您的用户名:py
请输入您的密码:147258
添加成功
那么,有了数据库,前面的工作只是建立了对应的数据库,更多的对数据库的操作,下一篇博文会更详细地说明
里面也已保存有我们的用户名和密码了,下面我们进行一个简单的登录操作
建立python文件
login.py
代码--------------------------------------------------------------------------
#coding:utf-8
import sqlite3,getpass
def showdate(username):
sql = sqlite3.connect('user_data.db')
data = sql.execute("select * from user where name='%s'"% username).fetchone()
sql.close()
return data
#("select * from user where username='%s'"% name)这条指令用来查询表user的name字段的对应的数据
#最后返回用户名对应的资料
def val():
while 1:
name = raw_input("用户名")#输入用户名
data = showdate(name)#获取用户名对应的数据库资料
if data:
passworld = getpass.getpass("密码") # 输入密码
if data[2] == passworld:
print "登录成功"
break
else:
print"密码错误"
else:
print"用户名错误"
#getpass模块可以使输入的字符不可见,在python的shell中可能无效,在终端中和用户登录效果相同,不出现输入字符
val()
print "进入用户操作"
$python login.py
这时会提示输入用户名和密码,输入错误将一直循环,直到输入正确用户名和密码。
这当然不是我们要的最终结果,我们还会要加入比如多次输入错误锁定用户,那么就要在数据库中存更多的数据
比如,错误次数字段,是否锁定状态的字段,锁定时间字段(方便一定时间后自动解锁),错误次数字段
当然,我们也可以加入用户地址,电话,邮箱等更多资料,不过这里只为了实现登录的操作,这些旁支也不在这里详述了