Как упоминалось ранее, файлы или простое постоянное хранилище могут удовлетворить потребности некоторых небольших приложений, в то время как большие серверы или приложения с большим объемом данных требуют более зрелой системы баз данных. Но сейчас время для больших данных. Помимо реляционных данных, будет также поддержка нереляционных баз данных, так что преимущества в производительности могут быть отражены в системе «трех максимумов». В этой статье в основном описывается взаимодействие между 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 и закрытия ресурсов каждый раз, когда вы выполняете операцию, это определенно неразумно, тогда как повторно использовать код, см. Более позднее обновление. Спасибо!