Python: работа с базой данных, часть 1/2: используем db-api

5.1. Введение

Первое, что Вы будете делать, редактирование скрипта setup.py.
Имеются некоторые переменные, которые сообщают где искать MySQL include-файлы
и библиотеки. Значения корректны для стандартной установки MySQL в Red Hat
Linux (6.2) RPM. Если Вы имеете другую платформу, Вы должны будете вычислить
нужные значения самостоятельно. Вам почти никогда не придется изменять это.
Если Вы имеете старую версию distutils (до 1.0.2), обновитесь или удалите
параметры, относительно которых система возражает.

Обратите внимание, что недавние двоичные дистрибутивы с www.mysql.com
включают два набора библиотек пользователей: mysqlclient и
mysqlclient_r. Последний хранит поточно-безопасные библиотеки, так что
используйте именно его, если потоки Вам нужны

Если Вы имеете динамические библиотеки пользователей (в Linux .so-файлы),
они будут использоваться по умолчанию. Если они не в Вашем стандартном пути
загрузчика, Вы должны будете установить или откорректировать системную
переменную LD_LIBRARY_PATH (в Linux) или ту, которую Ваша платформа
требует. Иначе Вы можете скорректировать setup.py, чтобы компоновать
со статической библиотекой. Если Вы используете стандартный пакет RPM, с этим
не должно быть особых проблем.

ПРЕДУПРЕЖДЕНИЕ: Если Вы используете двоичный пакет Zope, Вы
нуждаетесь в выполнении скрипта setup.py программой python из
Zope. Иначе Zope (ZMySQLDA) не может найти _mysql.

Если Вы предпочитаете RPM, Вы можете использовать команду bdist_rpm
с setup.py. Это только формирует RPM, но не устанавливает его.

Этот модуль должен быть совместим с более старым интерфейсом, написанным
Joe Skinner. Однако, старая версия:

  • Не поточно-совместимая (операции базы данных могли бы блокировать
    все другие потоки)
  • Написан для MySQL 3.21 (не компилируется для более новых
    версий без заплаток)
  • Не очень активно поддерживается

MySQLdb полностью новый модуль, распространяемый бесплатно согласно GNU
Public License. Никакой код из той версии не используется в MySQLdb.

Настройка подключения к базе данных MySQL Flask

Теперь мы подключимся и будем использовать MySQL для хранения данных в нашей базе данных. Если вы не знаете, как создать приложение для колбы, ознакомьтесь с руководством по введению в колбу .

1. Подключение приложения Flask к MySQL

Процедура, которой мы следуем для подключения Flask-MySQL, выглядит следующим образом:

from flask import Flask,render_template, request
from flask_mysqldb import MySQL

app = Flask(__name__)

app.config = 'localhost'
app.config = 'root'
app.config = ''
app.config = 'flask'

mysql = MySQL(app)

2. Настройка курсора подключения MySQL

Просто с приведенной выше настройкой мы не можем взаимодействовать с таблицами БД. Для этого нам нужно что-то под названием курсор .

Таким образом, Курсор обеспечивает способ взаимодействия Flask с таблицами БД. Он может сканировать данные БД, выполнять различные SQL-запросы, а также удалять записи таблиц.

Курсор используется следующим образом:

mysql = MySQL(app)

#Creating a connection cursor
cursor = mysql.connection.cursor()

#Executing SQL Statements
cursor.execute(''' CREATE TABLE table_name(field1, field2...) ''')
cursor.execute(''' INSERT INTO table_name VALUES(v1,v2...) ''')
cursor.execute(''' DELETE FROM table_name WHERE condition ''')

#Saving the Actions performed on the DB
mysql.connection.commit()

#Closing the cursor
cursor.close()

Поскольку MySQL не является autocommit DB, нам нужно зафиксировать вручную, т. Е. Сохранить изменения/действия, выполняемые cursor execute в БД .

3. Кодирование приложения для колбы

Теперь мы создадим небольшое приложение Flask, которое будет хранить данные, представленные пользователем, в таблице базы данных MySQL. Рассмотрим следующий код приложения:

from flask import Flask,render_template, request
from flask_mysqldb import MySQL

app = Flask(__name__)

app.config = 'localhost'
app.config = 'root'
app.config = ''
app.config = 'flask'

mysql = MySQL(app)

@app.route('/form')
def form():
    return render_template('form.html')

@app.route('/login', methods = )
def login():
    if request.method == 'GET':
        return "Login via the login Form"
    
    if request.method == 'POST':
        name = request.form
        age = request.form
        cursor = mysql.connection.cursor()
        cursor.execute(''' INSERT INTO info_table VALUES(%s,%s)''',(name,age))
        mysql.connection.commit()
        cursor.close()
        return f"Done!!"

app.run(host='localhost', port=5000)

Когда пользователь отправляет данные, они добавляются в базу данных MySQL с помощью команды cursor.execute . Мое имя таблицы info_table .

В form.html будет:

4. Реализация Кода

Теперь запустите сервер и перейдите в ” /форма ” ( см. Формы колбы )

Введите данные и нажмите Отправить

Теперь давайте проверим это в веб-интерфейсе phpMyAdmin

Идеально!!

5.5.1.1 ImportError: libmysqlclient.so.6: cannot open shared object file: No such file or directory

Вы имеете динамические библиотеки MySQL, и по умолчанию Ваш компилятор
линкует с ними, но они не в пути загрузчика, когда Вы
запускаете Python. Вы имеете два базисных параметра:

  1. Модифицируйте setup.py так, чтобы это компоновалось со статической
    библиотекой: уж ее-то искать не понадобится.
  2. Если Ваш компоновщик поддерживает переключатель пути загрузчика во время
    выполнения, Вы можете также устанавливать это в setup.py.
  3. Измените Вашу среду системы так, чтобы MySQL библиотеки нашлись в Вашем
    пути загрузчика. В Linux Вы можете изменять
    или Вы можете добавить каталог к системной переменной
    перед запуском Python.
    LD_LIBRARY_PATH=/path/to/mysql/libs python ... # Bourne-ish shell
    

Обновление записей

Когда мы поддерживаем базу данных, нам иногда нужно внести изменения в существующие записи. В этом разделе мы посмотрим на то, как это сделать.

Покажем, что ILS уведомляется о том, что один из его существующих клиентов, Федерация Big Business – это переезд до 23 фигуртов, 14534 Берлина. В этом случае администратор базы данных (это нас!), Нужно будет внести некоторые изменения.

К счастью, мы можем сделать это с нашей функцией Execute_Query рядом с SQL Обновить утверждение.

update = """
UPDATE client 
SET address = '23 Fingiertweg, 14534 Berlin' 
WHERE client_id = 101;
"""

connection = create_db_connection("localhost", "root", pw, db)
execute_query(connection, update)

Обратите внимание, что предложение, где здесь очень важно. Если мы запустим этот запрос без предложения Where, то все адреса для всех записей в нашей клиентской таблице будут обновлены до 23 фигуртов. Это очень не то, что мы стремимся сделать

Это очень не то, что мы стремимся сделать.

Также обратите внимание, что мы использовали «где» в запросе обновления. Было бы также возможно использовать «где» или «где» или даже «где адрес как«% falschung% »

Важно то, что предложение This позволяет нам однозначно идентифицировать запись (или записи), которые мы хотим обновить

Упорядочение результата

Предложение ORDER BY используется для упорядочивания результата. Рассмотрим следующий пример.

 
import mysql.connector 
 
#Create the connection object  
myconn = mysql.connector.connect(host = "localhost", user = "root",passwd = "google",database = "PythonDB") 
 
#creating the cursor object 
cur = myconn.cursor() 
 
try: 
    #Reading the Employee data     
    cur.execute("select name, id, salary from Employee order by name") 
 
    #fetching the rows from the cursor object 
    result = cur.fetchall() 
 
    print("Name    id    Salary"); 
 
    for row in result: 
        print("%s    %d    %d"%(row,row,row)) 
except: 
    myconn.rollback() 
 
myconn.close() 

Выход:

Name    id    Salary 
David   103    25000 
John    101    25000 
John    102    25000 
Mike    105    28000 
Nick    104    90000 

Установка DBAPI

По умолчанию SQLAlchemy работает только с базой данных SQLite без дополнительных драйверов. Для работы с другими базами данных необходимо установить DBAPI-совместимый драйвер в соответствии с базой данных.

Что такое DBAPI?DBAPI — это стандарт, который поощряет один и тот же API для работы с большим количеством баз данных. В следующей таблице перечислены все DBAPI-совместимые драйверы:

База данных DBAPI драйвер
MySQL PyMySQL, MySQL-Connector, CyMySQL, MySQL-Python (по умолчанию)
PostgreSQL psycopg2 (по умолчанию), pg8000,
Microsoft SQL Server PyODBC (по умолчанию), pymssql
Oracle cx-Oracle (по умолчанию)
Firebird fdb (по умолчанию), kinterbasdb

Все примеры в этом руководстве протестированы в PostgreSQL, но вы можете выбрать базу данных по вкусу. Для установки DBAPI psycopg2 для PostgreSQL введите следующую команду:

MySQLdb insert image

People often look for ways to insert images into databases. We will show
how it can be done in SQLite and Python. Note that some people do not
recommend to put images into databases. Images are binary data. MySQL database
has a special data type to store binary data called (Binary Large Object).
, , and
are variants of the binary object type.

mysql> CREATE TABLE Images(Id INT PRIMARY KEY, Data MEDIUMBLOB);
Query OK, 0 rows affected (0.08 sec)

For this example, we create a new table called .

insert_image.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb as mdb


def read_image():
    
    with open("sid.jpg") as f:
        
        img = f.read()
        return img
    

con = mdb.connect('localhost', 'testuser', 'test623', 'testdb')
 
with con:
    
    cur = con.cursor()
    data = read_image()
    cur.execute("INSERT INTO Images VALUES(1, %s)", (data, ))

In the above script, we read a JPG image from the disk and insert it
into the table.

def read_image():
    
    with open("sid.jpg") as f:
        
        img = f.read()
        return img

The method reads binary data from the JPG file,
located in the current working directory.

cur.execute("INSERT INTO Images VALUES(1, %s)", (data, ))

We insert the image data into the table.

pymysql

Самый простой и быстрый способ исправить ошибку — установить библиотеку pymysql:

Что бы вы смогли использовать ее в Django, в файле settings.py вам нужно импортировать библиотеку и использовать метод для подключения к API MySQLdb:

Эти настройки может понадобится положить в другие файлы, такие как ‘__init__.py’ или ‘manage.py’. Это зависит от вашего проекта. Суть в том, что мы должны импортировать pymysql до того, как будет выполнен импорт MySQLdb. Обычно это происходит в ‘settings.py’ в DATABASES.

Ниже пример файла настроек, который использую я при локальной разработке:

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3;

Я эту ошибку не встречал, но исправить ее можно вручную заменив версию mysqlclient следующим образом:

Каких либо ошибок при работе с этой библиотекой я не замечал.

MySQL install

If you do not already have MySQL installed, we must install it.

$ sudo apt-get install mysql-server

This command installs the MySQL server and various other packages.
While installing the package, we are prompted to enter
a password for the MySQL root account.

Next, we are going to create a new database user and a new database.
We use the client.

$ mysql -u root -p
Enter password: 

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
+--------------------+
2 rows in set (0.00 sec)

We connect to the database using the root account. We show all available
databases with the statement.

mysql> CREATE DATABASE testdb;
Query OK, 1 row affected (0.02 sec)

We create a new database. We will use this database
throughout the tutorial.

mysql> CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'test623';
Query OK, 0 rows affected (0.00 sec)

mysql> USE testdb;
Database changed

mysql> GRANT ALL ON testdb.* TO 'testuser'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> quit;
Bye

We create a new database user. We grant all privileges to this user
for all tables of the database.

PyMySQL — узнаем версию MySQL

В следующем примере показано, как отобразить текущую версию MySQL.

Python

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import pymysql

con = pymysql.connect(‘localhost’, ‘user17’,
‘s$cret’, ‘mydb’)

with con:

cur = con.cursor()
cur.execute(«SELECT VERSION()»)

version = cur.fetchone()

print(«Database version: {}».format(version))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#!/usr/bin/python3
# -*- coding: utf-8 -*-
 

importpymysql

con=pymysql.connect(‘localhost’,’user17′,

‘s$cret’,’mydb’)

withcon

cur=con.cursor()

cur.execute(«SELECT VERSION()»)

version=cur.fetchone()

print(«Database version: {}».format(version))

Для того чтобы узнать версию MySQL, можно использовать команду .

Python

import pymysql

1 importpymysql

Для этого потребуется импортировать модуль.

Python

con = pymysql.connect(‘localhost’, ‘user17’,
‘s$cret’, ‘mydb’)

1
2

con=pymysql.connect(‘localhost’,’user17′,

‘s$cret’,’mydb’)

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

  • имя хоста;
  • имя пользователя;
  • пароль;
  • название базы данных.

Python

with con:

1 withcon

При помощи интерпретатор Python автоматически открывает доступные ресурсы. Он также обрабатывает возможные ошибки.

Python

cur = con.cursor()

1 cur=con.cursor()

Из объекта подключения создается курсор. Курсор используется для перемещения записей из набора результатов.

Python

cur.execute(«SELECT VERSION()»)

1 cur.execute(«SELECT VERSION()»)

Для использования команды SQL вызывается метод курсора .

Python

version = cur.fetchone()

1 version=cur.fetchone()

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

Python

print(«Database version: {}».format(version))

1 print(«Database version: {}».format(version))

Таким образом, версия базы данных выводится на экран.

Shell

$ ./version.py
Database version: 5.7.23-0ubuntu0.16.04.1

1
2

$.version.py

Database version5.7.23-0ubuntu0.16.04.1

Это результат вывода.

MySQLdb create and populate table

We create a table and populate it with some data.

create_table.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb as mdb

con = mdb.connect('localhost', 'testuser', 'test623', 'testdb')

with con:
    
    cur = con.cursor()
    cur.execute("DROP TABLE IF EXISTS Writers")
    cur.execute("CREATE TABLE Writers(Id INT PRIMARY KEY AUTO_INCREMENT, \
                 Name VARCHAR(25))")
    cur.execute("INSERT INTO Writers(Name) VALUES('Jack London')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Honore de Balzac')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Lion Feuchtwanger')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Emile Zola')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Truman Capote')")

We create a table and add five authors to it.

with con:

With the with keyword, the Python interpreter automatically releases
the resources. It also provides error handling.

cur.execute("CREATE TABLE Writers(Id INT PRIMARY KEY AUTO_INCREMENT, \
                Name VARCHAR(25))")

This SQL statement creates a new database table called .
It has two columns: and .

cur.execute("INSERT INTO Writers(Name) VALUES('Jack London')")
cur.execute("INSERT INTO Writers(Name) VALUES('Honore de Balzac')")
...

We use the statement to insert authors to the table.
Here we add two rows.

mysql> SELECT * FROM Writers;
+----+-------------------+
| Id | Name              |
+----+-------------------+
|  1 | Jack London       |
|  2 | Honore de Balzac  |
|  3 | Lion Feuchtwanger |
|  4 | Emile Zola        |
|  5 | Truman Capote     |
+----+-------------------+
5 rows in set (0.00 sec)

After executing the script, we use the client tool to
select all data from the Writers table.

Создание таблицы

Первое что вам нужно для базы данных – это таблица. Это место, где ваши данные будут организованы и храниться. Большую часть времени вам будут нужны несколько таблиц, в каждой из которых будут храниться поднастройки ваших данных. Создание таблицы в SQL это просто. Все что вам нужно сделать, это следующее:

MySQL

CREATE TABLE table_name (
id INTEGER,
name VARCHAR,
make VARCHAR
model VARCHAR,
year DATE,
PRIMARY KEY (id)
);

1
2
3
4
5
6
7
8

CREATETABLEtable_name(

idINTEGER,

nameVARCHAR,

makeVARCHAR

modelVARCHAR,

yearDATE,

PRIMARY KEY(id)
);

Это довольно обобщенный код, но он работает в большей части случаев

Первое, на что стоит обратить внимание – куча слов прописанных заглавными буквами. Это команды SQL

Их не всегда нужно вписывать через капс, но мы сделали это, чтобы помочь вам увидеть их. Я также хочу обратить внимание на то, что каждая база данных поддерживает слегка отличающиеся команды. Большинство будет содержать CREATE TABLE, но типы столбцов баз данных могут быть разными. Обратите внимание на то, что в этом примере у нас есть базы данных INTEGER, VARCHAR и DATE.

DATE может вызывать много разных штук, как и VARCHAR. Проконсультируйтесь с документацией на тему того, что вам нужно делать. В любом случае, в этом примере мы создаем базу данных с пятью столбцами. Первый – это id, который мы настраиваем в качестве нашего основного ключа. Он не должен быть NULL, но мы и не указываем, что в нем, так как еще раз, каждый бекенд базы данных выполняет работу по-разному, или делает это автоматически для нас. Остальные столбцы говорят сами за себя

Some examples

The connect() method works nearly the same as with :

import MySQLdb
db=MySQLdb.connect(passwd="moonpie",db="thangs")

To perform a query, you first need a cursor, and then you can execute
queries on it:

c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
          WHERE price < %s""", (max_price,))

In this example, max_price=5 Why, then, use %s in the
string? Because MySQLdb will convert it to a SQL literal value, which
is the string ‘5’. When it’s finished, the query will actually say,
«…WHERE price < 5».

Why the tuple? Because the DB API requires you to pass in any
parameters as a sequence. Due to the design of the parser, (max_price)
is interpreted as using algebraic grouping and simply as max_price and
not a tuple. Adding a comma, i.e. (max_price,) forces it to make a
tuple.

And now, the results:

>>> c.fetchone()
(3L, 2L, 0L)

Quite unlike the _mysql example, this returns a single tuple,
which is the row, and the values are properly converted by default…
except… What’s with the L’s?

As mentioned earlier, while MySQL’s INTEGER column translates
perfectly into a Python integer, UNSIGNED INTEGER could overflow, so
these values are converted to Python long integers instead.

If you wanted more rows, you could use c.fetchmany(n) or
c.fetchall(). These do exactly what you think they do. On
c.fetchmany(n), the n is optional and defaults to
c.arraysize, which is normally 1. Both of these methods return a
sequence of rows, or an empty sequence if there are no more rows. If
you use a weird cursor class, the rows themselves might not be tuples.

Note that in contrast to the above, c.fetchone() returns None
when there are no more rows to fetch.

The only other method you are very likely to use is when you have to
do a multi-row insert:

c.executemany(
      """INSERT INTO breakfast (name, spam, eggs, sausage, price)
      VALUES (%s, %s, %s, %s, %s)""",
       )

Here we are inserting three rows of five values. Notice that there is
a mix of types (strings, ints, floats) though we still only use
%s. And also note that we only included format strings for one
row. MySQLdb picks those out and duplicates them for each row.

База данных Oracle

Предпосылки:

  • cx_Oracle пакет — Смотрите здесь для всех версий
  • Oracle клиент мгновенного — для Windows x64 , Linux x64

Настроить:

Установите пакет cx_Oracle как:

Извлеките мгновенный клиент Oracle и установите переменные среды как

Создание соединения:

Получить версию базы данных:

Пример вывода:

Выполнить запрос: SELECT

Вывод будет в кортежах Python:

(10, ‘SYSADMIN’, ‘IT-INFRA’, 7)

(23, «АССОЦИАТ HR», «ЛЮДСКИЕ РЕСУРСЫ», 6)

Выполнить запрос: INSERT

При выполнении вставки / обновления / удалении операции в базе данных Oracle, изменения доступны только в пределах сеанса до не выдаются. Когда обновленные данные передаются в базу данных, они становятся доступны другим пользователям и сеансам.

Выполнить запрос: INSERT с использованием переменных Bind

Ссылка

Переменные связывания позволяют вам повторно выполнять операторы с новыми значениями без дополнительных затрат на повторный анализ оператора. Переменные связывания улучшают возможность повторного использования кода и могут снизить риск атак SQL-инъекций.

Закрыть соединение:

Метод close () закрывает соединение. Любые соединения, не закрытые явно, будут автоматически освобождены после завершения сценария.

Functions and attributes

Only a few top-level functions and attributes are defined within
MySQLdb.

connect(parameters…)

Constructor for creating a connection to the
database. Returns a Connection Object. Parameters are the
same as for the MySQL C API. In addition, there are a few
additional keywords that correspond to what you would pass
mysql_options() before connecting. Note that some
parameters must be specified as keyword arguments! The
default value for each parameter is NULL or zero, as
appropriate. Consult the MySQL documentation for more
details. The important parameters are:

host
name of host to connect to. Default: use the local host
via a UNIX socket (where applicable)
user
user to authenticate as. Default: current effective user.
passwd
password to authenticate with. Default: no password.
db
database to use. Default: no default database.
port
TCP port of MySQL server. Default: standard port (3306).
unix_socket
location of UNIX socket. Default: use default location or
TCP for remote hosts.
conv
type conversion dictionary. Default: a copy of
MySQLdb.converters.conversions
compress
Enable protocol compression. Default: no compression.
connect_timeout
Abort if connect is not completed within
given number of seconds. Default: no timeout (?)
named_pipe
Use a named pipe (Windows). Default: don’t.
init_command
Initial command to issue to server upon
connection. Default: Nothing.
read_default_file
MySQL configuration file to read; see
the MySQL documentation for mysql_options().
read_default_group
Default group to read; see the MySQL
documentation for mysql_options().
cursorclass
cursor class that cursor() uses, unless
overridden. Default: MySQLdb.cursors.Cursor. This
must be a keyword parameter.
use_unicode

If True, CHAR and VARCHAR and TEXT columns are returned as
Unicode strings, using the configured character set. It is
best to set the default encoding in the server
configuration, or client configuration (read with
read_default_file). If you change the character set after
connecting (MySQL-4.1 and later), you’ll need to put the
correct character set name in connection.charset.

If False, text-like columns are returned as normal strings,
but you can always write Unicode strings.

This must be a keyword parameter.

charset

If present, the connection character set will be changed
to this character set, if they are not equal. Support for
changing the character set requires MySQL-4.1 and later
server; if the server is too old, UnsupportedError will be
raised. This option implies use_unicode=True, but you can
override this with use_unicode=False, though you probably
shouldn’t.

If not present, the default character set is used.

This must be a keyword parameter.

sql_mode

If present, the session SQL mode will be set to the given
string. For more information on sql_mode, see the MySQL
documentation. Only available for 4.1 and newer servers.

If not present, the session SQL mode will be unchanged.

This must be a keyword parameter.

ssl
This parameter takes a dictionary or mapping, where the
keys are parameter names used by the mysql_ssl_set MySQL
C API call. If this is set, it initiates an SSL connection
to the server; if there is no SSL support in the client,
an exception is raised. This must be a keyword
parameter.

MySQLdb transaction support

A transaction is an atomic unit of database
operations against the data in one or more databases.
The effects of all the SQL statements in a transaction can be either
all committed to the database or all rolled back.

For databases that support transactions, the Python interface silently starts a
transaction when the cursor is created. The method commits the
updates made using that cursor, and the method discards them.
Each method starts a new transaction.

The MySQL database has different types of storage engines. The most
common are the MyISAM and the InnoDB engines. Since MySQL 5.5, InnoDB becomes the
default storage engine. There is a trade-off between data security and database speed.
The MyISAM tables are faster to process and they do not support transactions.
The and methods are not implemented.
They do nothing. On the other hand, the InnoDB tables are more safe against the data loss.
They support transactions. They are slower to process.

transaction.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb as mdb
import sys


try:
    con = mdb.connect('localhost', 'testuser', 'test623', 'testdb')

    cur = con.cursor()
    cur.execute("DROP TABLE IF EXISTS Writers")
    cur.execute("CREATE TABLE Writers(Id INT PRIMARY KEY AUTO_INCREMENT, \
                 Name VARCHAR(25)) ENGINE=INNODB")
    cur.execute("INSERT INTO Writers(Name) VALUES('Jack London')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Honore de Balzac')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Lion Feuchtwanger')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Emile Zola')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Truman Capote')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Terry Pratchett')")
    
    con.commit()

    
except mdb.MySQLError, e:
  
    if con:
        con.rollback()
        
    print "Error %d: %s" % (e.args,e.args)
    sys.exit(1)
    
finally:    
            
    if con:    
        con.close()

We recreate the table. We explicitly work with transactions.

cur = con.cursor()

In Python DB API, we do not call the BEGIN statement to start a transaction.
A transaction is started when the cursor is created.

cur.execute("CREATE TABLE Writers(Id INT PRIMARY KEY AUTO_INCREMENT, \
                Name VARCHAR(25)) ENGINE=INNODB")

We are dealing with a InnoDB table type. For older MySQL versions (<5.5), we need
to specify the engine type with the option.

con.commit()

We must end a transaction with either a or a
method. If we comment this line, the table is
created but the data is not written to the table.

In this tutorial, we have been working with transactions without explicitly
stating them. We used context managers. The context manager handles
the entry and the exit from the desired runtime context for the execution of
the block of code. Context managers are normally invoked using the
statement.

Connection objects in module can be used as context managers.
They automatically commit or rollback transactions. Connection context
managers clean up code by factoring out , , and
statements.

transaction2.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb as mdb

con = mdb.connect('localhost', 'testuser', 'test623', 'testdb')

with con:
    
    cur = con.cursor()
    cur.execute("DROP TABLE IF EXISTS Writers")
    cur.execute("CREATE TABLE Writers(Id INT PRIMARY KEY AUTO_INCREMENT, \
                 Name VARCHAR(25))")
    cur.execute("INSERT INTO Writers(Name) VALUES('Jack London')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Honore de Balzac')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Lion Feuchtwanger')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Emile Zola')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Truman Capote')")
    cur.execute("INSERT INTO Writers(Name) VALUES('Terry Pratchett')")

In our code example, the context manager deals with all the work
necessary for error handling. It automatically commits or rolls back
the transaction.

This was MySQL Python tutorial. It used the legacy MySQLdb module
to work with MySQL. Refer to PyMySQL tutorial
to work with a modern PyMySQL module.

Формирование запросов

Важным этапом в работе с базой данных является формирование запросов к этой базе данных. Отчасти проблема заключается в необходимости вставлять в строку запроса данные пользовательского ввода, что абсолютно не безопасно. Далее об этом.

Экранирование символов. В MySQLdb есть 4 метода экранирования:

  1. con.escape
  2. con.escape_string
  3. con.string_literal
  4. И автоматический механизм подстановки значений:cur.execute(«SELECT *FROM `city` WHERE id_city=’?’», (city,))

Тут символ подстановки (?) замещается значением из кортежа (city,) автоматически экранируя спец. символы.

Но не существует единого правила оформления подстановки значений в запрос. Поэтому есть переменная paramstyle которая может определить формат подстановки.

У меня MySQLdb.paramstyle равен ‘format’.

Варианты формата:

  1. qmark – параметры обозначаются знаков вопроса (?)
  2. numeric — параметры обозначаются числами
  3. named — параметры обозначаются именами
  4. format — параметры обозначаются в стиле printf.
  5. pyformat — параметры обозначаются в стиле расширенного набора кодов формата Python — %(name)s

Но есть небольшая проблема.

В Python 3.x такой подход работать не будет. Если заглянуть под капот модуля MySQLdb и найти функцию execute (\Lib\site-packages\MySQLdb\cursors.py), то можно видеть что в Python 3.x подстановка параметров осуществляется используя функцию format:

А в Python 2.x используется простое формирование строки:

По всей видимости, разработчики забыли изменить документацию к функции. И поэтому формирование в стиле Си функции printf работает не будет.

Следовательно, нужно использовать следующий подход:

Говоря об экранирование, используя функции escape_string и string_literal, они не работают с кодировками, что является серьёзной проблемой. Раньше была функция escape которая принимала один параметр, но теперь ей требуется 2 параметра, причём второй это словарь с ссылками на функции каждого из типов, и честно говоря для меня он остался загадкой. Поэтому лучше использовать вариант с автоматическим экранированием. Автоматическое экранирование спец. символов реализовано используя функцию escape.

Если вы разрабатываете Web приложение, то стоит позаботиться о преобразование символов & « в соответствующие сущности языка разметки, такие как & «. Для этого можно использовать функцию escape() модуля cgi:

Или написать что-то своё, с более расширенным функционалом.

Пример использования:

Обратите внимание на VALUES ({name}), метку {name} не нужно загонять в кавычки. Автоматическая подстановка сделает это за Вас, иначе будет выведено сообщение об ошибке

Вот наверно и всё, что я хотел рассказать. Думаю этого достаточно для нормального старта с базой данных MySQL. Удачных экспериментов!

5.3.2 Объекты Connection

Объекты Connection возвращены функцией .

commit()

Если база данных и таблица поддерживают транзакции, это передает текущую
транзакцию, Иначе этот метод успешно не делает ничего.

rollback()

Если база данных и таблица поддерживают транзакции, это отменяет текущую
транзакцию, Иначе этот метод вызывает исключение
.

Примечание совместимости: старые версии
определяют этот метод, так
что он не далет ничего. Это опасное поведение, поскольку успешная обратная
перемотка указывает, что текущая транзакция отменена.

cursor()

MySQL не поддерживает курсоры, однако, курсоры легко эмулируются. Вы
можете обеспечивать альтернативный класс курсора как факультативный параметр.
Если это не представлено, берется значение по умолчанию данное при создании
объекта подключения или стандартного класса .

begin()
Явно запускает транзакции. Обычно Вы не должны использовать это:
выполнение запроса начинает новую транзакцию, если ни одной работающей нет.
Если включен AUTOCOMMIT, Вы можете использовать для его
временного отключения. AUTOCOMMIT продолжит работу после следующего вызова
или .

Подведем итоги

В данной статье мы рассмотрели ряд различных тем. Вы освоили основы использования SQL. Также вы узнали кое-что о различных способах подключения к базам данных, используя Python. Это был не исчерпывающий список способов, и тем не менее. Существует ряд других пакетов, которые вы можете использовать для подключения к различным базам данных.

К примеру, мы даже не затронули вопрос использования MongoDb, как и других баз данных NoSQL, несмотря на то, что они так же поддерживаются Python. Если база данных не так популярна, по сравнению с остальными, скорее всего, есть способ подключиться к ней с помощью Python. Вам определенно следует потратить время на то, чтобы проверить эти пакеты лично и найти тот самый!

Заключение

Мы охватили много земли в этом руководстве.

Мы узнали, как использовать Python и MySQL Connector для создания совершенно новой базы данных в MySQL Server, создавать таблицы в этой базе данных, определить отношения между этими таблицами и заполнить их с помощью данных.

Мы покрыли, как Создать, прочитать, обновлять и удалять Данные в нашей базе данных.

Мы посмотрели, как извлечь данные из существующих баз данных и загружать их в Pandas DataFrames, готовые к анализу и дальнейшей работы, используя преимущества всех возможностей, предлагаемых Pydata Stack Отказ

Переходя в другом направлении, мы также узнали, как принимать данные, созданные нашими сценариями и приложениями Python, и писать в базе данных, где их можно безопасно хранить для последующего поиска и манипулирования.

Я надеюсь, что это учебное пособие помогло вам посмотреть, как мы можем использовать Python и SQL вместе, чтобы еще более эффективно манипулировать данными!

Если вы хотите увидеть больше моих проектов и работы, пожалуйста, посетите мой сайт в craigdoesdata.de Отказ Если у вас есть какие-либо отзывы в этом руководстве, пожалуйста, свяжитесь со мной Прямо – все отзывы тепло получаются!

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: