Как мне подключиться к базе данных MySQL на Python?

1020

Как подключиться к базе данных MySQL с помощью программы python?

  • 41
    Большинство ответов здесь сосредоточены на установке библиотеки MySQLdb. Я бы действительно предложил выбрать MySQL Connector / Python, предоставляемый MySQL / Oracle, что значительно упрощает процесс: stackoverflow.com/questions/372885/…
  • 8
    Проблема с использованием Oracle Connector / Python состоит в том, что у него есть небольшие ошибки и другие проблемы интеграции. Его легко установить, но практически невозможно заставить работать для всех реальных сценариев использования, для которых я его пробовал. Поэтому я всегда рекомендую MySQLdb.
Показать ещё 1 комментарий
Теги:

21 ответ

1169

Подключение к MYSQL через Python в 3 этапа

1 - Настройка

Вы должны установить драйвер MySQL, прежде чем делать что-либо. В отличие от PHP, только драйвер SQLite по умолчанию устанавливается вместе с Python. Наиболее используемый пакет для этого - MySQLdb, но его трудно установить с помощью easy_install.

Для пользователя Windows вы можете получить исполняемый файл MySQLdb.

Для Linux это случайный пакет (python-mysqldb). (Вы можете использовать sudo apt-get install python-mysqldb (для дистрибутивов на основе Debian), yum install MySQL-python (для rpm) или dnf install python-mysql (для современного дистрибутива fedora) в командной строке для загрузки.)

Для Mac вы можете установить MySQLdb, используя Macport.

2 - Использование

После установки перезагрузите компьютер. Это не обязательно, но это не даст мне ответить на 3 или 4 вопроса в этом посте, если что-то пойдет не так. Поэтому, пожалуйста, перезагрузитесь.

Тогда это похоже на использование любого другого пакета:

#!/usr/bin/python
import MySQLdb

db = MySQLdb.connect(host="localhost",    # your host, usually localhost
                     user="john",         # your username
                     passwd="megajonhy",  # your password
                     db="jonhydb")        # name of the data base

# you must create a Cursor object. It will let
#  you execute all the queries you need
cur = db.cursor()

# Use all the SQL you like
cur.execute("SELECT * FROM YOUR_TABLE_NAME")

# print all the first cell of all the rows
for row in cur.fetchall():
    print row[0]

db.close()

Конечно, есть тысячи возможностей и вариантов; это очень простой пример. Вам придется посмотреть на документацию. Хорошая отправная точка.

3 - Более продвинутое использование

Как только вы узнаете, как это работает, вы можете захотеть использовать ORM, чтобы избежать написания SQL вручную и манипулировать вашими таблицами, как они были объектами Python. Самым известным ORM в сообществе Python является SQLAlchemy.

Я настоятельно советую вам использовать его: ваша жизнь будет намного проще.

Недавно я обнаружил еще одну драгоценность в мире Python: peewee. Это очень легкий ORM, его очень легко и быстро настроить, а затем использовать. Это делает мой день для небольших проектов или автономных приложений, где использование больших инструментов, таких как SQLAlchemy или Django, излишне:

import peewee
from peewee import *

db = MySQLDatabase('jonhydb', user='john', passwd='megajonhy')

class Book(peewee.Model):
    author = peewee.CharField()
    title = peewee.TextField()

    class Meta:
        database = db

Book.create_table()
book = Book(author="me", title='Peewee is cool')
book.save()
for book in Book.filter(author="me"):
    print book.title

Этот пример работает из коробки. Ничего, кроме наличия peewee (pip install peewee) не требуется.

  • 39
    Рад, что ты любишь peeeee !! Я добавил поддержку MySQL, а также некоторую документацию по интеграции с ним. Счастливого взлома!
  • 13
    Обратите внимание, что на момент написания этой статьи MySQLdb не поддерживает Python 3. На странице sourceforge написано «Поддержка Python 3 появится в ближайшее время», но она не обновлялась с 2012-10-08. Для Python 3 есть PyMySQL и oursql .
Показать ещё 16 комментариев
167

Вот один из способов сделать это:

#!/usr/bin/python
import MySQLdb

# Connect
db = MySQLdb.connect(host="localhost",
                     user="appuser",
                     passwd="",
                     db="onco")

cursor = db.cursor()

# Execute SQL select statement
cursor.execute("SELECT * FROM location")

# Commit your changes if writing
# In this case, we are only reading data
# db.commit()

# Get the number of rows in the resultset
numrows = cursor.rowcount

# Get and display one row at a time
for x in range(0, numrows):
    row = cursor.fetchone()
    print row[0], "-->", row[1]

# Close the connection
db.close()

Ссылка здесь

  • 4
    Есть ли необходимость в этом примере, поскольку вы не изменяете базу данных?
  • 3
    ВНИМАНИЕ - этот модуль не поддерживает часовой пояс при подключении
Показать ещё 4 комментария
112

Oracle (MySQL) теперь поддерживает чистый коннектор Python. Это означает, что для установки нет двоичных файлов: это просто библиотека Python. Он называется "Connector/Python".

http://dev.mysql.com/downloads/connector/python/

  • 1
    это быстрее, чем с помощью mysqldb?
  • 8
    Да, это. Кроме того, это меньше хлопот, чем MySQLdb, и API, на мой взгляд, лучше. Это должно быть ответом.
Показать ещё 6 комментариев
100

Если вам не нужен MySQLdb, но я бы принял любую библиотеку, я бы очень-очень рекомендовал MySQL Connector/Python из MySQL: http://dev.mysql.com/downloads/connector/python/.

Это один пакет (около 110k), чистый Python, поэтому он независим от системы и мертв, простота установки. Вы просто загружаете, дважды щелкаете, подтверждаете лицензионное соглашение и идите. Нет необходимости в Xcode, MacPorts, компиляции, перезапуске...

Затем вы подключаетесь как:

import mysql.connector    
cnx = mysql.connector.connect(user='scott', password='tiger',
                              host='127.0.0.1',
                              database='employees')

try:
   cursor = cnx.cursor()
   cursor.execute("""
      select 3 from your_table
   """)
   result = cursor.fetchall()
   print result
finally:
    cnx.close()
  • 2
    Не так просто, как вы утверждаете. Когда я попытался установить rpm, я получил несколько проблем с зависимостями (FileDigests и PayloadIsXz) из моего RPM: rpm -i mysql-connector-python-1.1.5-1.el6.noarch.rpm error: Failed dependencies: rpmlib(FileDigests) <= 4.6.0-1 is needed by mysql-connector-python-1.1.5-1.el6.noarch rpmlib(PayloadIsXz) <= 5.2-1 is needed by mysql-connector-python-1.1.5-1.el6.noarch
  • 0
    Пожалуйста, в этом случае попробуйте независимую от платформы версию (для установки которой требуется команда командной строки ... немного сложнее, чем двойной щелчок), похоже, это зависимости, вызванные упаковкой.
Показать ещё 11 комментариев
95

Остановить использование MySQLDb, если вы хотите избежать установки заголовков mysql только для доступа к mysql из python.

Используйте pymysql. Он делает все, что делает MySQLDb, но реализован исключительно на Python с НЕТ внешних зависимостей. Это делает процесс установки на всех операционных системах последовательным и легким. pymysql является заменой для MySQLDb и IMHO, нет оснований когда-либо использовать MySQLDb для чего-либо... КОГДА-ЛИБО! - PTSD from installing MySQLDb on Mac OSX and *Nix systems, но это только я.

Установка

pip install pymysql

Что ты... ты готов играть.

Пример использования pymysql Github repo

import pymysql.cursors
import pymysql

# Connect to the database
connection = pymysql.connect(host='localhost',
                             user='user',
                             password='passwd',
                             db='db',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

try:
    with connection.cursor() as cursor:
        # Create a new record
        sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
        cursor.execute(sql, ('webmaster@python.org', 'very-secret'))

    # connection is not autocommit by default. So you must commit to save
    # your changes.
    connection.commit()

    with connection.cursor() as cursor:
        # Read a single record
        sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
        cursor.execute(sql, ('webmaster@python.org',))
        result = cursor.fetchone()
        print(result)
finally:
    connection.close()

ТАКЖЕ - быстро и прозрачно заменяйте MySQLdb в существующем коде

Если у вас есть существующий код, который использует MySQLdb, вы можете легко заменить его на pymysql, используя этот простой процесс:

# import MySQLdb << Remove this line and replace with:
import pymysql
pymysql.install_as_MySQLdb()

Все последующие ссылки на MySQLdb будут использовать pymysql прозрачно.

  • 3
    «Всегда» немного сильно ... Что не так с peewee или sqlalchemy? Даже если они существуют в виде библиотек ORM, они все равно полезны
  • 3
    Нет, я не думаю, что это сильно. Учитывая возможность использования MySQLDb или PyMysql, я думаю, что выбор PyMysql не представляет никакой сложности, потому что это простая установка pip без каких-либо зависимостей, в то время как MySQLDb требует, чтобы для вашей платформы ОС были установлены заголовочные файлы разработки mysql. Sqlalchemy не учитывает это, потому что ему все еще нужно обернуть модуль, который может общаться с mysql, такой как PyMysql, MySQLDb, CyMySQL и т. Д. Peewee выглядит интересно, но я проверю это
Показать ещё 2 комментария
18

В качестве драйвера db существует также oursql. Некоторые из причин, перечисленных в этой ссылке, которые говорят, почему oursql лучше:

  • oursql имеет реальную параметризацию, посылая SQL и данные в MySQL полностью отдельно.
  • oursql позволяет передавать текстовые или двоичные данные в базу данных и выводиться из базы данных, вместо того чтобы требовать, чтобы все было буферизовано в клиенте.
  • oursql может вставлять строки лениво и извлекать строки лениво.
  • По умолчанию ussql поддерживает поддержку unicode.
  • oursql поддерживает python с 2.4 по 2.7 без каких-либо предупреждений об отказе от версии 2.6+ (см. PEP 218) и без полного отказа 2,7 (см. PEP 328).
  • oursql запускается изначально на python 3.x.

Итак, как подключиться к mysql с oursql?

Очень похоже на mysqldb:

import oursql

db_connection = oursql.connect(host='127.0.0.1',user='foo',passwd='foobar',db='db_name')
cur=db_connection.cursor()
cur.execute("SELECT * FROM `tbl_name`")
for row in cur.fetchall():
    print row[0]

учебник в документации довольно приличный.

И, конечно, для ORM SQLAlchemy - хороший выбор, как уже упоминалось в других ответах.

  • 3
    Я не понимаю, "работает на Python 3.x". Я просто попытался установить его, и setup.py разбомбил, потому что он даже не использует Python 3-совместимые вызовы печати. Звучало здорово, пока я не попробовал.
17

Попробуйте использовать MySQLdb

Здесь можно найти страницу: http://www.kitebird.com/articles/pydbapi.html


На странице:

# server_version.py - retrieve and display database server version

import MySQLdb

conn = MySQLdb.connect (host = "localhost",
                        user = "testuser",
                        passwd = "testpass",
                        db = "test")
cursor = conn.cursor ()
cursor.execute ("SELECT VERSION()")
row = cursor.fetchone ()
print "server version:", row[0]
cursor.close ()
conn.close ()
  • 2
    ВНИМАНИЕ - этот модуль не поддерживает часовой пояс при подключении
  • 1
    @kommradHomer Можете ли вы уточнить, пожалуйста?
Показать ещё 3 комментария
11

Несмотря на все ответы выше, если вы не хотите подключаться к определенной базе данных заранее, например, если вы хотите создать базу данных еще (!), вы можете использовать connection.select_db(database), как показано ниже.

import pymysql.cursors
connection = pymysql.connect(host='localhost',
                         user='mahdi',
                         password='mahdi',
                         charset='utf8mb4',
                         cursorclass=pymysql.cursors.DictCursor)
cursor = connection.cursor()
cursor.execute("CREATE DATABASE IF NOT EXISTS "+database)
connection.select_db(database)
sql_create = "CREATE TABLE IF NOT EXISTS "+tablename+(timestamp DATETIME NOT NULL PRIMARY KEY)"
cursor.execute(sql_create)
connection.commit()
cursor.close()
8

SQLAlchemy


SQLAlchemy - это набор инструментов Python SQL и Object Relational Mapper, который предоставляет разработчикам приложений полную мощь и гибкость SQL. SQLAlchemy предоставляет полный набор хорошо известных шаблонов персистентности корпоративного уровня, предназначенных для эффективного и высокопроизводительного доступа к базе данных, адаптированных к простому языку домена Pythonic.

Монтаж

pip install sqlalchemy

RAW запрос

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session

engine = create_engine("mysql://<user_name>:<password>@<host_name>/<db_name>")
session_obj = sessionmaker(bind=engine)
session = scoped_session(session_obj)

# insert into database
session.execute("insert into person values(2, 'random_name')")
session.flush()
session.commit()

ORM способ

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session

Base = declarative_base()
engine = create_engine("mysql://<user_name>:<password>@<host_name>/<db_name>")
session_obj = sessionmaker(bind=engine)
session = scoped_session(session_obj)

# Bind the engine to the metadata of the Base class so that the
# declaratives can be accessed through a DBSession instance
Base.metadata.bind = engine

class Person(Base):
    __tablename__ = 'person'
    # Here we define columns for the table person
    # Notice that each column is also a normal Python instance attribute.
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)

# insert into database
person_obj = Person(id=12, name="name")
session.add(person_obj)
session.flush()
session.commit()
8

MySQLdb - это простой способ. Вы можете выполнить SQL-запросы по соединению. Период.

Мой предпочтительный способ, который также является pythonic, заключается в использовании мощного SQLAlchemy. Вот связанный с запросом учебник, и вот учебник по Возможности ORM SQLALchemy.

  • 1
    Ссылки мертвы, вы можете посмотреть на это и обновить его правильной ссылкой?
6

Просто модификация выше ответа. Просто запустите эту команду, чтобы установить mysql для python

sudo yum install MySQL-python
sudo apt-get install MySQL-python

помню! Он чувствителен к регистру.

  • 0
    Я установил MySQL-python через yum install. Установка была завершена, но я не могу импортировать модуль MySQLdb. Там нет такого модуля. Есть идеи, почему это так?
3

Лучший способ подключиться к MySQL из python - это использовать MySQL Connector/Python, потому что это официальный драйвер Oracle для MySQL для работы с Python и он работает как с Python 3, так и с Python 2.

выполните шаги, указанные ниже, чтобы подключить MySQL

  1. установить разъем с помощью пипса

    pip install mysql-connector-python

или вы можете скачать установщик с https://dev.mysql.com/downloads/connector/python/

  1. Используйте метод connect() Python коннектора mysql для подключения к MySQL.pass обязательный аргумент метода connect(). т.е. хост, имя пользователя, пароль и имя базы данных.

  2. Создайте объект cursor из объекта подключения, возвращенного методом connect() для выполнения запросов SQL.

  3. закройте соединение после завершения вашей работы.

Пример:

import mysql.connector
 from mysql.connector import Error
 try:
     conn = mysql.connector.connect(host='hostname',
                         database='db',
                         user='root',
                         password='passcode')
     if conn.is_connected():
       cursor = conn.cursor()
       cursor.execute("select database();")
       record = cursor.fetchall()
       print ("Your connected to - ", record)
 except Error as e :
    print ("Print your error msg", e)
 finally:
    #closing database connection.
    if(conn.is_connected()):
       cursor.close()
       conn.close()

Ссылка - https://pynative.com/python-mysql-database-connection/

Важный API MySQL Connector Python

  • Для операций DML - используйте cursor.execute() и cursor.executemany() для запуска запроса. и после этого используйте connection.commit() чтобы сохранить ваши изменения в БД

  • Для извлечения данных - используйте cursor.execute() для запуска запроса, а cursor.fetchall(), cursor.fetchone(), cursor.fetchmany(SIZE) для извлечения данных.

3

Также посмотрите Storm. Это простой инструмент сопоставления SQL, который позволяет вам легко редактировать и создавать записи SQL без написания запросов.

Вот простой пример:

from storm.locals import *

# User will be the mapped object; you have to create the table before mapping it
class User(object):
        __storm_table__ = "user" # table name
        ID = Int(primary=True) #field ID
        name= Unicode() # field name

database = create_database("mysql://root:password@localhost:3306/databaseName")
store = Store(database)

user = User()
user.name = u"Mark"

print str(user.ID) # None

store.add(user)  
store.flush() # ID is AUTO_INCREMENT

print str(user.ID) # 1 (ID)

store.commit() # commit all changes to the database

Чтобы найти и использовать объект:

michael = store.find(User, User.name == u"Michael").one()
print str(user.ID) # 10

Найти с помощью первичного ключа:

print store.get(User, 1).name #Mark

Для получения дополнительной информации см. tutorial.

2

для Python3.6 я нашел два драйвера: pymysql и mysqlclient. Я проверил производительность между ними и получил результат: mysqlclient работает быстрее.

ниже мой тестовый процесс (нужно установить python lib profilehooks для анализа прошедшего времени:

raw sql: select * from FOO;

немедленно выполнить в терминале MySQL: 46410 rows in set (0.10 sec)

Pymysql (2,4 с):

from profilehooks import profile
import pymysql.cursors
import pymysql
connection = pymysql.connect(host='localhost', user='root', db='foo')
c = connection.cursor()

@profile(immediate=True)
def read_by_pymysql():
    c.execute("select * from FOO;")
    res = c.fetchall()

read_by_pymysql()

здесь профиль pymysql: Изображение 805


mysqlclient (0.4с)

from profilehooks import profile
import MySQLdb

connection = MySQLdb.connect(host='localhost', user='root', db='foo')
c = connection.cursor()

@profile(immediate=True)
def read_by_mysqlclient():
    c.execute("select * from FOO;")
    res = c.fetchall()

read_by_mysqlclient()

вот профиль mysqlclient: Изображение 806

Итак, похоже, что mysqlclient намного быстрее, чем pymysql

2

mysqlclient является лучшим, поскольку другие обеспечивают поддержку только определенных версий Python

 pip install mysqlclient

пример кода

    import mysql.connector
    import _mysql
    db=_mysql.connect("127.0.0.1","root","umer","sys")
    #db=_mysql.connect(host,user,password,db)
    # Example of how to insert new values:
    db.query("""INSERT INTO table1 VALUES ('01', 'myname')""")
    db.store_result()
    db.query("SELECT * FROM new1.table1 ;") 
    #new1 is scheme table1 is table mysql 
    res= db.store_result()
    for i in range(res.num_rows()):
        print(result.fetch_row())

см. https://github.com/PyMySQL/mysqlclient-python

1

Вы можете подключить свой код Python к MySQL таким образом.

import MySQLdb
db = MySQLdb.connect(host="localhost",
                 user="appuser",
                 passwd="",
                 db="onco")

cursor = db.cursor()
1

сначала установите драйвер

pip install MySQL-python   

Затем базовый код будет выглядеть следующим образом:

#!/usr/bin/python
import MySQLdb

try:
    db = MySQLdb.connect(host="localhost",      # db server, can be a remote one 
                     db="mydb"                  # database
                     user="mydb",               # username
                     passwd="mydb123",          # password for this username
                     )        

    # Create a Cursor object
    cur = db.cursor()

    # Create a query string. It can contain variables
    query_string = "SELECT * FROM MY_TABLE"

    # Execute the query
    cur.execute(query_string)

    # Get all the rows present the database
    for each_row in cur.fetchall():
        print each_row

    # Close the connection
    db.close()
except Exception, e:
    print 'Error ', e 
0

Это Mysql соединение с БД

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

app = Flask(__name__)


app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'root'
app.config['MYSQL_DB'] = 'MyDB'

mysql = MySQL(app)


@app.route('/', methods=['GET', 'POST']) 
def index():
    if request.method == "POST":
        details = request.form
        cur = mysql.connection.cursor()
        cur.execute ("_Your query_")
        mysql.connection.commit()
        cur.close()
        return 'success'
    return render_template('index.html')


if __name__ == '__main__':
    app.run()
0

Сначала установите драйвер (Ubuntu)

  • sudo apt-get установить python-pip

  • sudo pip install -U pip

  • sudo apt-get установить python-dev libmysqlclient-dev

  • sudo apt-get установить MySQL-python

Коды подключения к базе данных MySQL

import MySQLdb
conn = MySQLdb.connect (host = "localhost",user = "root",passwd = "pass",db = "dbname")
cursor = conn.cursor ()
cursor.execute ("SELECT VERSION()")
row = cursor.fetchone ()
print "server version:", row[0]
cursor.close ()
conn.close ()
0

Для python 3.3

CyMySQL https://github.com/nakagami/CyMySQL

У меня есть pip, установленный на моих окнах 7, просто pip install cymysql

(вам не нужен cython) быстрый и безболезненный

  • 0
    Это дает мне ошибку, человек -.-
  • 3
    Вы можете создать новый вопрос по SO и прокомментировать со ссылкой на него здесь.
-1

Сначала установите Python-MySQL соединитель с https://dev.mysql.com/downloads/connector/python/

на консоли Python введите:

pip install mysql-connector-python-rf
import mysql.connector
  • 1
    Вопрос был слишком широким, но этот ответ кажется слишком узким (по крайней мере, в том смысле, что установка и импорт одного модуля не сработает). Также кажется, что оболочка и питон смешаны в одном блоке кода без каких-либо объяснений или подсказок относительно того, что происходит, где и что делает.
Сообщество Overcoder
Наверх
Меню