Как мне подключиться к базе данных MySQL на Python? - PullRequest
1071 голосов
/ 17 декабря 2008

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

Ответы [ 21 ]

1193 голосов
/ 07 марта 2009

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

1 - Настройка

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

Для пользователей Windows вы можете получить exe 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) не требуется.

174 голосов
/ 17 декабря 2008

Вот один из способов сделать это, используя MySQLdb , который поддерживает только Python 2:

#!/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()

Ссылка здесь

114 голосов
/ 28 мая 2013

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

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

105 голосов
/ 07 января 2014

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

Это один пакет (около 110 Кб), чистый 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()
103 голосов
/ 29 декабря 2015

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

Используйте pymysql . Он делает все то, что делает MySQLDb, но он был реализован исключительно на Python с НЕТ внешних зависимостей . Это делает процесс установки во всех операционных системах единообразным и простым. pymysql - это замена замены MySQLDb, и ИМХО нет причин когда-либо использовать 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 прозрачно.

21 голосов
/ 17 декабря 2008

Попробуйте использовать MySQLdb . MySQLdb поддерживает только Python 2.

Здесь можно разместить страницу здесь: 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 ()
18 голосов
/ 16 октября 2012

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

  • oursql имеет реальную параметризацию, отправляя SQL и данные в MySQL совершенно отдельно.
  • oursql позволяет передавать текстовые или двоичные данные в базу данных и выводить их из базы данных, вместо того чтобы требовать буферизации всего в клиенте.
  • oursql может как лениво вставлять строки, так и лениво извлекать строки.
  • В нашем скрипте по умолчанию включена поддержка юникода.
  • 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 является хорошим выбором, как уже упоминалось в других ответах.

11 голосов
/ 22 июня 2016

Несмотря на все ответы выше, если вы не хотите подключаться к конкретной базе данных заранее, например, если вы хотите создать базу данных еще (!), Вы можете использовать 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()
9 голосов
/ 11 апреля 2018

SQLAlchemy


SQLAlchemy - это набор инструментов Python SQL и объектно-реляционный маппер, который дает разработчикам приложений полную мощь и гибкость 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 way

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 голосов
/ 17 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...