与Python交互
使用pymysql来代替MySQLdb模块,它们用法非常相似。
Connection对象
- 用于创建数据库的连接
- 创建对象调用connect()方法
connection = pymysql.connect(
host = 'localhost',
user = 'root',
password = 'password',
database = 'learn',
port = 3306,
charset='utf8'
)
# connection = pymysql.connect(参数)
pymysql.png
connection对象的方法:
- close():关闭连接
- commit():事务,提交生效
- rollback():事务,放弃之前的操作
- cursor():返回cursor对象,用于执行sql语句并获得结果
Cursor()对象
- 执行sql语句
- 创建对象:调用Connection对象的cursor()方法
cursor = connection.cursor()
cursor对象的方法:
- close():关闭
- execute(sql):执行sql语句,返回受影响的行数
- fetchone():执行查询语句时,获取查询结果集的第一行数据,并以元组的形式返回
- fetchall():执行查询语句时,获取数据结果集的所有行,将每行构成一个元组,在将这些元组放入一个元组里返回
- next():执行查询语句时,获取当前行的下一行
- scroll(value[,mode]):将行指针移动到某个位置
* mode:表示移动方式
* mode的默认值为relative,表示基于当前行移动到value,value为正则向下移动,value为负则向上移动
* mode的值为absolute,表示基于第一条数据的位置,第一条数据的位置为0
cursor对象的属性:
- rowcount:只读属性,表示最近一次execute()执行后受影响的行数
- connection:获得当前连接对象
需要注意的是,pymysql默认开启事务,所以执行DML操作时需要commit或rollback
总结:
连接数据库(创建Connection对象)→创建游标(创建cursor对象)→执行SQL(使用cursor)→fetch获得数据,进行业务处理(使用cursor)→关闭游标→commit(使用connection)→关闭数据库连接
import pymysql
try:
connection = pymysql.connect(
host = 'localhost',
user = 'root',
password = 'password',
database = 'learn',
port = 3306,
charset='utf8'
)
cursor = connection.cursor()
sql = 'insert into students(name) value("jtt")'
cursor.execute(sql)
connection.commit()
cursor.close()
connection.close()
except Exception as e:
print(e)
参数化
一种解决sql注入的方式。
SQL注入:针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。
通过分析可以知道用户如果输入了一些意外的字符,那么会导致不安全的问题出现,如图所示,通过拼凑sql语句用户可以获得所有信息。所以不得不在后台处理数据时,考虑到这些问题。为此引进了参数化。
import pymysql
name = input("name:")
params = [name]
try:
connection = pymysql.connect(
host = 'localhost',
user = 'root',
password = '199711',
database = 'learn',
port = 3306,
charset='utf8'
)
cursor = connection.cursor()
sql = "select * from students where name=%s"
cursor.execute(sql,params)
result = cursor.fetchall()
cursor.close()
connection.close()
print(result)
except Exception as e:
print(e)
需要注意的是,%s是一个占位符需要和格式化输出区别,无论是什么数据类型都要使用%s占位,params是一个列表,存放变量。
网友评论