Mysql教程
Mysql教程-PyMySql的使用
PyMySQL的使用-能够使用PyMySQL链接数据库并完成数据库的增删改查
安装PyMySql
安装pymysql第三方包:pip install pymysql
pip list 查看使用pip命令安装的第三方包列表
pip show pymysql 命令查看pymysql的信息
用pymysql连接数据库
import pymysql try: conn = pymysql.connect( host='127.0.0.1', # 参数host:连接的mysql主机,如果本机是'localhost'或者127.0.0.1 port=3306, # mysql端口3306 user='root', #mysql用户名 passwd='mysql', # mysql密码 db='jing_dong', # 数据库名 charset='utf8' # 数据库编码 ) except Exception as e: print(e) else: print('成功连接数据')
连接对象操作说明:
关闭连接 conn.close()
提交数据 conn.commit()
撤销数据 conn.rollback()
游标对象操作说明:
获取游标对象: cur =conn.cursor()
使用游标执行SQL语句: execute(operation [parameters ]) 执行SQL语句,返回受影响的行数,主要用于执行insert、update、delete、select等语句
获取查询结果集中的一条数据:cur.fetchone()返回一个元组, 如 (1,'张三')
获取查询结果集中的所有数据: cur.fetchall()返回一个元组,如((1,'张三'),(2,'李四'))
关闭游标: cur.close(),表示和数据库操作完成
用pymysql完成数据的查询操作
import pymysql try: conn = pymysql.connect( host='127.0.0.1', # 参数host:连接的mysql主机,如果本机是'localhost'或者127.0.0.1 port=3306, # mysql端口3306 user='root', #mysql用户名 passwd='mysql', # mysql密码 db='jing_dong', # 数据库名 charset='utf8' # 数据库编码 ) except Exception as e: print(e) else: pass # print('成功连接数据') cur = conn.cursor() sql = 'select * from tb_contents;' row_count = cur.execute(sql) print(row_count) # 61 全部内容条数 data_one = cur.fetchone() print(type(data_one)) # <class 'tuple'> print(data_one) # 第一条数据的内容(元组) data_all = cur.fetchall() # 数据库全部内容条数,返回一个元组,元素是单个数据的元组 print(len(data_all)) # 60 因为前面已经取出了一条,所以这里是60条 for data in data_all: print(data[0]) # id print(data[1]) # title cur.close() # 关闭游标 conn.close() # # 关闭连接
pymysql完成对数据的增删改
import pymysql try: conn = pymysql.connect( host='127.0.0.1', # 参数host:连接的mysql主机,如果本机是'localhost'或者127.0.0.1 port=3306, # mysql端口3306 user='root', #mysql用户名 passwd='mysql', # mysql密码 db='jing_dong', # 数据库名 charset='utf8' # 数据库编码 ) except Exception as e: print(e) else: pass # print('成功连接数据') cur = conn.cursor() try: # 添加 SQL 语句 sql = "insert into students(id,name) values(1,'刘璐'), (2,'王美丽');" # 删除 SQ L语句 sql = "delete from students where id = 2;" # 修改 SQL 语句 sql = "update students set name = '陈婷' where id = 1;" # 执行 SQL 语句 row_count = cur.execute(sql) print("SQL 语句执行影响的行数%d" % row_count) # 提交数据到数据库 conn.commit() except Exception as e: # 回滚数据, 即撤销刚刚的SQL语句操作 print('操作有误,回滚数据') conn.rollback() # 关闭游标 cur.close() # 关闭连接 conn.close()
防止SQL注入
什么是SQL注入?用户提交带有恶意的数据与SQL语句进行字符串方式的拼接,从而影响了SQL语句的语义,最终产生数据泄露的现象。
如何防止SQL注入?SQL语句参数化
SQL语言中的参数使用%s来占位,此处不是python中的字符串格式化操作
将SQL语句中%s占位所需要的参数存在一个列表中,把参数列表传递给execute方法中第二个参数
防止SQL注入的示例代码:
import pymysql try: conn = pymysql.connect( host='127.0.0.1', # 参数host:连接的mysql主机,如果本机是'localhost'或者127.0.0.1 port=3306, # mysql端口3306 user='root', #mysql用户名 passwd='mysql', # mysql密码 db='jing_dong', # 数据库名 charset='utf8' # 数据库编码 ) except Exception as e: print(e) else: pass # print('成功连接数据') def main(): ''' #不安全的写法 name = input('请输入名字') # 当输入' or 1 = 1 or '的时候,sql = "select * from students where name='' or 1 = 1 or '';"这样就查询了整个表的数据 sql = "select * from students where name='%s';" % name print(sql) cur = conn.cursor() row_count = cur.execute(sql) print(row_count) print(cur.fetchall()) ''' # 安全的写法 name = input('请输入名字') params = [name] cur = conn.cursor() row_count = cur.execute("select * from students where name=%s",params) print(row_count) print(cur.fetchall()) # 注意: # 如果要是有多个参数,需要进行参数化 # 那么params = [数值1, 数值2....],此时sql语句中有多个%s即可 # %s 不需要带引号 # 这时候当输入' or 1 = 1 or '的时候,返回的数据为0,避免了恶意查询 # 关闭Cursor对象 cur.close() # 关闭Connection对象 conn.close() if __name__ == '__main__': main()
最后修改:2020年3月19日 11:15