要实现数据库存储用户资料,首先要建立一个数据库文件,并建立对应的表来存储对应的用户资料
我们先建立一个简单的数据库,里面只存储了用户的用户名和密码。
我们用python里自带的sqlite3来建立一个数据库
新建一个python文件:create_sql.py
代码:----------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #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
代码:--------------------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #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
代码:---------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #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
代码:--------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #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
代码--------------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #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
这时会提示输入用户名和密码,输入错误将一直循环,直到输入正确用户名和密码。
这当然不是我们要的最终结果,我们还会要加入比如多次输入错误锁定用户,那么就要在数据库中存更多的数据
比如,错误次数字段,是否锁定状态的字段,锁定时间字段(方便一定时间后自动解锁),错误次数字段
当然,我们也可以加入用户地址,电话,邮箱等更多资料,不过这里只为了实现登录的操作,这些旁支也不在这里详述了