MySQL(四)

与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注入.png

     通过分析可以知道用户如果输入了一些意外的字符,那么会导致不安全的问题出现,如图所示,通过拼凑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是一个列表,存放变量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容