Как записать кадр данных pandas в виде таблицы в базу данных MySQL?

Просто быстрый вопрос, ребята: я создал базу данных в mysql (мнения):

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| opinions           |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.06 sec)

У меня также есть кадр данных pandas df:

import pandas as pd
df = pd.read_csv('file.csv', sep='|', names=['id', 'opinions'])
df.head(3)

Вне:

    id content
0   id1 'blablababla
1   id2 'blalbabla
...
n   idn 'blalbabl

Затем я хотел бы загрузить df в виде таблицы (items) в базу данных opinions. Вот что я пробовал:

import mysql.connector
from sqlalchemy import create_engine

engine = create_engine('mysql+mysqlconnector://user:password@localhost:3306/opinions', echo=False)
df.to_sql(name='items', con=engine, if_exists = 'replace', index=False)
df

Однако я получил это исключение:

OperationalError: (mysql.connector.errors.OperationalError) 2055: Lost connection to MySQL server at 'localhost:3306', system error: 32 Broken pipe

Как мне загрузить или записать таблицу df в базу данных opinions?


person tumbleweed    schedule 07.06.2016    source источник
comment
ваша проблема заключается в чтении базы данных, а не в записи в нее   -  person Paul H    schedule 07.06.2016
comment
Спасибо за помощь @PaulH, не могли бы вы привести пример того, как это сделать правильно?   -  person tumbleweed    schedule 07.06.2016
comment
Возможно, поможет PyMySQL и cnx = pymysql.connect(user='user', password='pw', host= '127.0.0.1', port=3306, db='mydb', autocommit=True) df=psql.read_sql_query('call sproc', con=cnx)   -  person jezrael    schedule 07.06.2016
comment
@jezrael спасибо за отзыв, я попробовал ваш подход и получил: OperationalError: (1045, "Access denied for user 'user'@'localhost' (using password: YES)")   -  person tumbleweed    schedule 07.06.2016
comment
Хм, может быть, помогите этому.   -  person jezrael    schedule 07.06.2016
comment
Вы действительно создали таблицу в базе данных? Если нет, то проблема не в пандах, а в ваших знаниях баз данных в целом, я бы пошел учиться основам использования базы данных, а затем решил вышеуказанную проблему. Если вы создали таблицу в MySQL, покажите sql «создать таблицу» выше.   -  person Merlin    schedule 07.06.2016
comment
Да, имя таблицы — мнения2. Я также создал еще одну таблицу: items. Я просто хочу научиться писать это.... Это всего лишь пример, это не настоящий случай @Merlin   -  person tumbleweed    schedule 07.06.2016


Ответы (2)


На вашем сервере MySQL opinions — это не table, а database (как подразумевает show databases), который в основном представляет собой набор таблиц. Однако вы можете выполнять операторы select только для таблиц.

Вы можете проверить, какие таблицы, например. существует через SHOW TABLES IN opinions. Также удобно добавить базу данных в качестве аргумента подключения:

config = {
    'user' : 'root',
    'passwd' : 'password',
    'host' : 'localhost',
    'raise_on_warnings' : True,
    'use_pure' : False,
    'database' : 'opinions'
    }
con = mysql.connector.connect(**config)

В результате все ссылки на таблицы будут направлены на таблицы в базе данных opinions. Обычный выбор в существующей таблице должен работать:

data = pd.read_sql('SELECT * FROM <some_table_name>', con)
person sebastian    schedule 07.06.2016
comment
Это действительно сработало. Однако я все еще не могу загрузить фрейм данных в базу данных в виде таблицы, ни вставить фрейм данных в таблицу: Empty DataFrame Columns: [id, opinions] Index: [] - person tumbleweed; 07.06.2016
comment
Я не совсем знаком с pandas, но действительно ли вы получили какие-либо результаты с помощью вызова read_sql? Также: если мой ответ помог вам, пожалуйста, примите его :) - person sebastian; 07.06.2016
comment
Спасибо за помощь, Себастьян, я приму ваш ответ. Еще одна вещь, я попробовал следующее: df.to_sql(name = 'opinions2', con = con, flavor='mysql', schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None). Однако, когда я описываю это с помощью sql, таблица пуста... как мне загрузить фрейм данных в базу данных как новую таблицу или перезаписать ее в существующую таблицу? - person tumbleweed; 07.06.2016
comment
Ну, если таблица пуста, вам придется сначала заполнить некоторые данные. Вы могли бы, например. создайте кадр данных с некоторыми произвольными данными (соответствующими определению вашей таблицы) и вставьте его в свою базу данных. Возможно, вам также следует подумать о том, что вы на самом деле пытаетесь выполнить (чтение данных из sql и попытка вставить их обратно не имеет особого смысла, в конце концов...) - person sebastian; 07.06.2016

Используйте Pandas для чтения из MySQL. MySQLdb для записи в базу данных.

  mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | opinions           |
    | performance_schema |
    | sys                |
    +--------------------+

Большой! В вашем примере замените test на opinions

mysql> use test;
Reading table information for completion of table and column names

Database changed
mysql> show tables;
+-----------------+
| Tables_in_test |
+-----------------+
| _t              |
| food            |
| food_in         |
| food_min        |
| type            |
| user            |
+-----------------+
4 rows in set (0.00 sec)

mysql> select * from test.food;
+----+-------+--------------+--------+----------+
| ID | Cat   | Item         | price  | quantity |
+----+-------+--------------+--------+----------+
|  1 | Food  | Pizza        | 2.7500 |      300 |
|  2 | Liq   | Beer         | 2.5000 |      300 |
|  4 | Food  | Sandwich     | 4.0000 |      222 |
| 12 | Food  | Soup         | 3.5000 |      100 |
+----+-------+--------------+--------+----------+
4 rows in set (0.00 sec)

So:

data = pd.read_sql('SELECT * FROM opinions', con)

Превращается в:

data = pd.read_sql('SELECT * FROM opinions.MYTABLETHATIWANT', con)

Я использую MySQLdb для записи в базу данных. Итак, я могу использовать базовый Python и pandas. У вас также могут быть проблемы с разрешениями, которые препятствуют доступу к базе данных/таблице. Вы используете root или другого пользователя и установили разрешение для пользователя.

person Merlin    schedule 07.06.2016
comment
Спасибо за помощь, не могли бы вы привести пример того, как это написать? - person tumbleweed; 07.06.2016
comment
@ml_student что написать? - person Merlin; 07.06.2016
comment
Фрейм данных pandas df, если предположить, что он у меня уже есть... На самом деле у меня уже есть кадр данных с данными... Я просто пропустил его из-за проблем с пространством... - person tumbleweed; 07.06.2016
comment
Вы все еще не говорите мне, что вы хотели бы помочь вам написать? Обновите вопрос выше - person Merlin; 07.06.2016
comment
Обновил статус вопроса, спасибо за помощь - person tumbleweed; 07.06.2016
comment
Я вижу, вы используете «root» в MySQL. Прекратите! -- создайте пользователя и используйте этого пользователя. Вы читали документы о пандах, записывающих в базу данных. Я не использую pandas для записи в MySQL. Извините, тут мало помощи -- - person Merlin; 07.06.2016