python - pymysql (11)

Как упоминалось ранее, файлы или простое постоянное хранилище могут удовлетворить потребности некоторых небольших приложений, в то время как большие серверы или приложения с большим объемом данных требуют более зрелой системы баз данных. Но сейчас время для больших данных. Помимо реляционных данных, будет также поддержка нереляционных баз данных, так что преимущества в производительности могут быть отражены в системе «трех максимумов». В этой статье в основном описывается взаимодействие между Python и реляционной базой данных (mysql).

основное содержание

1 Технические моменты для освоения
2 Установите pymysql
3 Введение в pymysql.cursors и pymysql.connections
4 Реализуйте простые примеры CRUD

Необходимо освоить технические моменты

1 должна быть базовой операцией данных mysql, чтобы знать, например, написание, основные концепции SQL-оператора базы данных, если они не понимают, студенты могут перейти к учебным пособиям mysql для новичков .
2 должны знать синтаксис на основе Python, в конце концов, это pymysql Python для написания программ для обработки данных.

Установите pymysql

Подробное объяснение установки pymysql .

pymysql.connections

В объектно-ориентированном мире все является объектом.Соединения представляют собой необходимость установить соединение с базой данных для связи между приложением и базой данных. Это самый простой механизм: только через соединение с базой данных можно передавать команды на сервер и получать возвращаемые результаты. Когда соединение (или пул соединений) установлено, вы можете создать курсор, отправить запрос в базу данных, а затем получить ответ от базы данных.
Подробное объяснение общих методов класса соединений:

Название метода описание
Закрыть() Закрыть соединение с базой данных
совершить () Зафиксировать текущую транзакцию
откат () Отменить текущую транзакцию
курсор() Используйте это соединение для создания (и возврата) курсора или подобного курсору объекта
обработчик ошибок (cxn, cur, errcls, errval) Как обработчик курсора данного соединения

pymysql.cursors

курсоры курсоры позволяют пользователям отправлять команды базы данных и получать результаты запроса

Подробное объяснение общих методов класса курсоров

Имя метода или атрибут описание
размер массива При использовании метода fetchmany () количество строк результатов, извлекаемых за один раз, по умолчанию равно 1
связь Создайте соединение для этого курсора (необязательно)
описание Возвращает состояние активности курсора (кортеж из 7 элементов): (name, type_code, display_size, internal_ size, precision, scale, null_ok), требуются только name и type_code
lastrowid Идентификатор последней измененной строки (необязательно; если идентификатор строки не поддерживается, возвращается None)
rowcount Количество строк, обработанных или затронутых последним методом execute * ()
callproc (функция [, аргументы]) Вызов хранимой процедуры
Закрыть() Закрыть курсор
выполнить (op [, args]) Выполнить запрос или команду к базе данных
исполнение (op , args) Подобно комбинации execute () и map (), подготовить и выполнить запросы или команды к базе данных для всех заданных параметров.
fetchone () Получить следующую строку результата запроса
fetchmany ([размер = размер курсора. массив]) Получите следующую строку размера результата запроса
fetchall () Получить все (оставшиеся) строки результатов запроса
iter () Создайте объект-итератор для курсора (необязательно, см. Next ())
Сообщения Список сообщений, полученных из базы данных после выполнения курсора (набор кортежей, необязательно)
следующий () Используется итератором для получения следующей строки результата запроса (необязательно, аналогично fetchone (), см. __Iter __ ())
nextset () Перейти к следующему набору результатов (если поддерживается)
номер строки Индекс курсора в текущем наборе результатов (в строчных единицах, начиная с 0, необязательно)
setinputsizes (размеры) Установите максимально допустимый размер ввода (необходимо, но реализация не является обязательной)
setoutputsize (размер [, столбец]) Установите максимальный размер буфера для больших столбцов (обязательно, но реализация необязательна)

Реализуйте простой случай CRUD

Данные запроса

import  pymysql
#获取连接对象
connection = pymysql.connect("localhost","root","root","users",charset="utf8")
#通过连接对象获取游标
cursor = connection.cursor()
#操作数据
sql = "select * from my_user"
cursor.execute(sql)
#返回影响的行数
#print(cursor.rowcount)

#获取查询数据
#fetchone 获取单条数据   返回是元组类型
# result = cursor.fetchone()
# for message in result:
#     print(message)

#获取全部数据
for  id,name,address,sex,phone,age,pw in cursor.fetchall():
    print(id,name,address,phone,age,pw)

#带参数查询
#操作数据   (查询id= 3  这条记录)
#================1 参数和写死在str中====================
#   sql = "select * from my_user where u_id = 3"
#cursor.execute(sql)

#=============2 str动态拼接=  (解决不了sql注入问题)====================
# sql = "select * from my_user where u_id = %d " % (4)
# cursor.execute(sql)

#=======3  通过cursor.execute(sql,arge) 参数来实现=====(可以解决sql注入问题)==============
sql = "select * from my_user where u_id = %s "
cursor.execute(sql,[4])

#关闭资源
cursor.close()
connection.close()

SQL-инъекция проблема

#sql注入问题
import  pymysql
#获取连接对象
connection = pymysql.connect("localhost","root","root","users",charset="utf8")
#通过连接对象获取游标
cursor = connection.cursor()


name = "'admin' or 1=1 -- "
pw = "123"

#=============2 str动态拼接=  (解决不了sql注入问题)====================
# sql = "select * from my_user where u_name=%s and u_password=%s" % (name,pw)
# cursor.execute(sql)

#=======3  通过cursor.execute(sql,arge) 参数来实现=====(可以解决sql注入问题)==============
sql = "select * from my_user where u_name=%s and u_password=%s"
cursor.execute(sql,[name,pw])


#fetchone 获取单条数据   返回是元组类型
print(cursor.fetchone())

#关闭资源
cursor.close()

Вставить данные

import  pymysql
# 1 Connection 连接  事务 默认是手动提交
message ={"host":"localhost","user":"root","password":"root","database":"test","charset":"utf8"}
connection  =  pymysql.connect(**message)
# 2 通过connectin对象获取游标
cursor = connection.cursor()
#3  执行语句
#sql ="insert into dept values (null,'研发')"
#添加动态的数据,但是避免不了sql注入
sql ="insert into dept values (null,'%s')" % "行政"
#print(sql)
#添加动态的数据 可以防止sql注入
#sql ="insert into dept values (null,%s)"
#print(sql)
#print(cursor.execute(sql,["人事"]))
print(cursor.execute(sql))
#手动提交事务
connection.commit()
#关闭数据连接
cursor.close()
connection.close()

удалить данные

# pymysql 连接数据(删除数据)
import  pymysql

#根据地址 ,端口  ,用户  密码,获取连接
message= {"host":"localhost","user":"root","password":"root","database":"test","charset":"utf8"}
#connection = pymysql.connect("localhost","root","root","test")
connection = pymysql.connect(**message)
# 通过连接对象 去获取游标对象  (执行sql)
cursor = connection.cursor()

sql = "delete from myuser where u_id =%s"
#cursor.execute(sql,["李四2","深圳市xx","男",22,12121])
number = cursor.execute(sql,[70])
print(number)
#提交事务
connection.commit()
#关闭资源
cursor.close()
connection.close()

изменить данные

# pymysql 连接数据(修改数据)
import  pymysql

#根据地址 ,端口  ,用户  密码,获取连接
message= {"host":"localhost","user":"root","password":"root","database":"test","charset":"utf8"}
#connection = pymysql.connect("localhost","root","root","test")
connection = pymysql.connect(**message)
# 通过连接对象 去获取游标对象  (执行sql)
cursor = connection.cursor()

sql = "update myuser set u_name=%s where  u_id=%s"
#cursor.execute(sql,["李四2","深圳市xx","男",22,12121])
number = cursor.execute(sql,["张三2",70])
print(number)
#提交事务
connection.commit()
#关闭资源
cursor.close()
connection.close()

Если вам нужно написать код для получения соединений, выполнения sql и закрытия ресурсов каждый раз, когда вы выполняете операцию, это определенно неразумно, тогда как повторно использовать код, см. Более позднее обновление. Спасибо!

рекомендация

отblog.csdn.net/yipianfeng_ye/article/details/82761105
рекомендация