Python连接SQL数据库实现登录、注册功能
python联合SQL数据库实现简单的账户登录注册功能,也总结了一下自己遇到的小坑
·
首先创建自己的sql server数据库,并通过SQL Server 身份验证登录
创建自己的数据库,具体方法不详细介绍了。
列的数据类型尤为重要,这里我才用的是nvarchar(MAX),因为不同的数据类型会导致后续获取的长度是不同的,会影响判断。(之前采用的是nchar(10)数据类型,在python中查询到的数据为固定长度10,影响其判断是否正确)
再通过Qt Designer根据自己的想法设计登录界面和注册界面
对象命名为:
分别保存为login.ui对应的为登录界面 register.ui对应的为注册界面
在python程序中采用的为动态加载UI文件
登录段代码为:
class Win_Login(object):
def __init__(self):
#self.get_conn()
# 从文件中加载UI定义
# 从 UI 定义中动态 创建一个相应的窗口对象
# 注意:里面的控件对象也成为窗口对象的属性了
# 比如 self.ui.btn_login , self.ui.edt_password
self.ui = QUiLoader().load('login.ui')
self.ui.btn_login.clicked.connect(self.onSignIn)
self.ui.edt_password.returnPressed.connect(self.onSignIn)
self.ui.btn_register.clicked.connect(self.open_register_window)
# 获取连接
def mysql_conn(self):
conn = pymssql.connect(host='**.**.**.**', user='sa', password='****',
database='NamePwd',charset='utf8')
# 以字典形式输出数据 不设置则默认为元组类型输出
#cursor = conn.cursor(DictCursor)
return conn
#登录
def onSignIn(self):
username = self.ui.edt_username.text().strip()
password = self.ui.edt_password.text().strip()
conn = self.mysql_conn()
# 得到一个游标对象
cus1 = conn.cursor()
# 根据用户名查询密码
#login_sql = 'select password from admin where name= %s'
cus1.execute(login_sql,(username,))
result = cus1.fetchone()
print(result)
if result == None:
QMessageBox.warning(self.ui, '登录失败', '用户名错误')
print("用户名错误")
elif str(result[0]) == password:
SI.mainWin = Win_Main()
SI.mainWin.ui.show()
self.ui.edt_password.setText('')
self.ui.hide()
print("登陆成功")
else:
QMessageBox.warning(self.ui, '登录失败', '密码错误')
print("密码错误")
conn.commit()
cus1.close()
conn.close()
#打开注册界面
def open_register_window(self):
SI.registerWin = Win_Register()
SI.registerWin.ui.show()
注册段代码为:
class Win_Register :
def __init__(self):
self.ui = QUiLoader().load('register.ui')
self.ui.btn_reg.clicked.connect(self.RegisterAccout)
# 获取连接
def mysql_conn(self):
conn = pymssql.connect(host='**.**.**.**', user='sa', password='***',
database='NamePwd',charset='utf8')
# 以字典形式输出数据 不设置则默认为元组类型输出
#cursor = conn.cursor(DictCursor)
return conn
#注册
def RegisterAccout(self):
conn = self.mysql_conn()
reg_username = self.ui.reg_username.text().strip()
reg_password = self.ui.reg_password.text().strip()
reg_repassword = self.ui.reg_repassword.text().strip()
if reg_password != reg_repassword:
print("两次密码输入不一致,请重新输入!")
return
check_sql = 'select name from admin where BINARY name =%s ' # 加入BINARY关键字,可使查询结果区分大小写
# 得到一个游标对象
cus1 = conn.cursor()
# 根据用户名查询密码
login_sql = 'select password from admin where name= %s'
cus1.execute(check_sql, reg_username)
res = cus1.fetchone()
print(res)
#res = conn.cursor.execute(check_sql, (reg_username,))
print(res)
if res:
print("用户名【%s】已存在,请重新输入!" % reg_username)
return
else:
cus1.execute(register_sql, (reg_username, reg_password))
#conn.cursor.execute(register_sql, (reg_username, reg_password))
print("注册成功!")
conn.commit()
conn.close()
return
注意:conn.commit()代表着提交事务,不可缺少!之前少了这一个数据库一直不发生变化
更多推荐
已为社区贡献1条内容
所有评论(0)