Чтобы использовать методы и член объекта, вам сначала нужно создать этот объект. Если вы его не создали (переменная, которая должна содержать объект, не инициализируется), но вы пытаетесь использовать его методы или переменные, вы получите эту ошибку.
Иногда вы можете просто забыть инициализировать .
Отредактировано: new не может вернуть значение null, но исключение огня при ошибке. Давно это было на некоторых языках, но не больше. Спасибо @John Saunders за указание на это.
1 - Настройка
Перед выполнением чего-либо вы должны установить драйвер MySQL. В отличие от PHP, по умолчанию с помощью Python установлен только драйвер SQLite. Наиболее используемый пакет для этого - MySQLdb , но его сложно установить с помощью easy_install.
Для пользователя Windows вы можете получить exe из MySQLdb ,
Для Linux это случайный пакет (python-mysqldb). (Вы можете использовать sudo apt-get install python-mysqldb
(для дистрибутивов на основе debian), yum install MySQL-python
(для rpm-based) или dnf install python-mysql
(для современного fedora distro) в командной строке для загрузки.)
Для 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
).
SQLAlchemy - это инструментарий Python SQL и реляционный сопоставление объектов, который дает разработчикам приложений полную мощность и гибкость SQL. SQLAlchemy предоставляет полный набор хорошо известных шаблонов персистентности на уровне предприятия, предназначенных для эффективного и высокопроизводительного доступа к базе данных, адаптированного к простому языку языка Pythonic.
blockquote>Установка
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>/smsmagic") 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>/smsmagic") 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()
В качестве драйвера db существует также oursql . Некоторые из причин, перечисленных в этой ссылке, говорят о том, почему oursql лучше:
blockquote>
- 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?
Очень похоже to 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 - хороший выбор, как уже упоминалось в других ответах.
Для написания приложений баз данных на Python необходимо выполнить следующие пять шагов:
Импортировать SQL-интерфейс с помощью следующей команды:
>>> import MySQLdb
Установить соединение с базой данных с помощью следующую команду:
conn = MySQLdb.connect (host = 'localhost', user = 'root', passwd = '') ... где host - это имя ваш хост-компьютер, за которым следуют имя пользователя и пароль. В случае корня нет необходимости указывать пароль.
blockquote> blockquote> blockquote>Создайте курсор для соединения со следующей командой:
>>>cursor = conn.cursor()
Выполните любой SQL-запрос, используя этот курсор, как показано ниже: здесь выходы в терминах показывают количество строк, затронутых этим запросом:
курсор. execute («Создать библиотеку базы данных») // Указывает, сколько строк затронуто
blockquote> blockquote> blockquote>>>> cursor.execute('use Library') >>>table='create table books(book_accno char(30) primary key, book_name char(50),no_of_copies int(5),price int(5))' >>> cursor.execute(table)
Наконец, выберите набор результатов и выполните итерацию по этому набору результатов. На этом этапе пользователь может получить результирующие наборы, как показано ниже:
>>> cursor.execute('select * from books') >>> cursor.fetchall()
((«Py9098», «Программирование с помощью Python», 100L, 50L), («Py9099», «Программирование с Python ', 100L, 50L))
Если вам не нужен 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()
Вот один из способов сделать это:
#!/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()
вы можете связать свой код python с mysql таким образом.
import MySQLdb
db = MySQLdb.connect(host="localhost",
user="appuser",
passwd="",
db="onco")
cursor = db.cursor()
Сначала установите драйвер (Ubuntu)
Коды подключения к базе данных 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 ()
Просто модификация выше ответа. Просто запустите эту команду, чтобы установить mysql для python
sudo yum install MySQL-python
sudo apt-get install MySQL-python
, помните! Это чувствительно к регистру.
для Python3.6 Я нашел два драйвера: pymysql и mysqlclient. Я тестировал производительность между ними и получил результат: mysqlclient быстрее.
ниже - мой тестовый процесс (необходимо установить python lib profilehooks для анализа времени:
raw sql: select * from FOO;
немедленно выполняется в терминале mysql: 46410 rows in set (0.10 sec)
pymysql (2.4s):
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()
mysqlclient (0.4s)
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 намного быстрее, чем pymysql
Oracle (MySQL) теперь поддерживает чистый коннектор Python. Это означает, что нет двоичных файлов для установки: это просто библиотека Python. Он называется «Connector / Python».
Для python 3.3
CyMySQL https://github.com/nakagami/CyMySQL
У меня есть pip, установленный на моих окнах 7, просто pip установить cymysql
(вам не нужен cython) быстро и безболезненно
Несмотря на все ответы выше, если вы не хотите подключаться к определенной базе данных заранее, например, если вы хотите создать базу данных еще (!), вы можете использовать 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()
Также посмотрите на 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
MySQLdb - это простой способ. Вы можете выполнить SQL-запросы по соединению. Период.
. Мой предпочтительный способ, который также является pythonic, заключается в использовании мощного SQLAlchemy . Вот учебник , связанный с запросом , и вот учебник по возможностям ORM SQLALchemy.
Попробуйте использовать 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 ()
Остановить использование MySQLDb, если вы хотите избежать установки заголовков mysql только для доступа к mysql из python.
blockquote>Используйте pymysql . Он выполняет все, что делает MySQLDb, но был реализован исключительно в Python с NO External Dependencies . Это делает процесс установки на всех операционных системах последовательным и легким.
pymysql
является заменой MySQLDb и IMHO, нет оснований когда-либо использовать MySQLDb для чего-либо ... КОГДА-ЛИБО!PTSD from installing MySQLDb on Mac OSX and *Nix systems
, но это только я.Установка
pip install pymysql
Вот и все ... вы готовы играть.
blockquote>Пример использования из 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 в существующем коде быстро и прозрачно
blockquote>Если у вас есть существующий код, который использует MySQLdb, вы можете легко заменить его на pymysql, используя этот простой процесс:
# import MySQLdb << Remove this line and replace with: import pymysql pymysql.install_as_MySQLdb()
Все последующие ссылки на MySQLdb будут использовать pymysql прозрачно.
Сначала установите python-mysql-коннектор из https://dev.mysql.com/downloads/connector/python/
на консоли Python введите:
pip install mysql-connector-python-rf
import mysql.connector
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())
Лучший способ подключения к MySQL из python - использовать MySQL Connector / Python, потому что он является официальным драйвером Oracle для работы MySQL с Python и работает как с Python 3, так и с Python 2.
следовать шаги, упомянутые ниже, для подключения соединителя MySQL
pip install mysql-connector-python
или вы можете загрузить установщик из https: // dev. mysql.com/downloads/connector/python/
connect()
для подключения к mysql-коннектору python для подключения к MySQL. Добавьте необходимый аргумент в метод connect()
. хост, имя пользователя, пароль и имя базы данных. cursor
из объекта соединения, возвращаемого методом connect()
для выполнения SQL-запросов. Пример:
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
cursor.execute()
и cursor.executemany()
для запуска запроса. и после этого используйте connection.commit()
для продолжения изменений в DB cursor.execute()
для запуска запроса и cursor.fetchall()
, cursor.fetchone()
, cursor.fetchmany(SIZE)
для извлечения данных сначала установите драйвер
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