Ошибка при вставке данных из Python в MySQL

130
23 января 2020, 04:40

У меня есть код:

import pandas as pd
from sqlalchemy import create_engine
data=[[18:04:23, 24, 0.63790, 45, 892]
[18:12:27, 32, 0.54881, 36, 701]
[18:34:34, 46, 0.45972, 27, 610]
[18:59:56, 02, 0.36363, 08, 529]
[18:59:56, 02, 0.36363, 08, 529]
[18:59:56, 02, 0.36363, 08, 529]
[18:59:56, 02, 0.36363, 08, 529]
[19:06:23, 67, 0.27054, 99, 438]
[19:23:43, 56, 0.18145, 80, 347]
[19:32:45, 99, 0.09236, 71, 256]
[19:43:12, 13, 0.90327, 62, 165]
[19:43:12, 13, 0.90327, 62, 165]
[20:04:00, 24, 0.81418, 53, 074]
[20:38:24, 54, 0.72509, 44, 983]
[20:47:46, 75, 0.63690, 35, 892]
[21:04:59, 83, 0.54781, 26, 701]
[06:04:23, 67, 0.52342, 26, 345]]
db_connection = 'mysql+pymysql://AAA:OOO@localhost/PPAP'   
conn = create_engine(db_connection)
for i in data:
    pd.read_sql('INSERT IGNORE test (Time,ID,X,Y) VALUES(%s,%s,%s,%s)' % (i[0],i[1],i[2],i[3]), conn)

Код должен просто вставлять в бд данные, однако возникает следующая ошибка: ResourceClosedError: This result object does not return rows. It has been closed automatically.

По какой-то мне неведомой причине это происходит именно в питоне. Подскажите пожалуйста в чем проблема.

Answer 1

pd.read_sql предназначен для того, чтобы читать данные из базы. Чтобы складывать данные в базу, используйте pandas.DataFrame.to_sql.

При этом обратите внимание на то, как он работает: ссылка на документацию

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

Но, на самом деле, вообще не понятно, зачем вам здесь пандас. Вы можете просто использовать conn.execute, чтобы выполнить ваш запрос.

UPD: По вашему вопросу в комментариях - попробуйте вот так:

db_connection = 'mysql+pymysql://AAA:OOO@localhost/PPAP'   
engine = create_engine(db_connection)
conn = engine.connect()
# И дальше уже делаете ваши запросы через conn.execute
Answer 2

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

df = pd.DataFrame(data, columns=['Time','ID','X','Y','Z'])
df.to_sql('table_name', conn, if_exists='replace')

NOTE: В зависимости от ваших целей вам возможно придется указать другое значение для параметра if_exists:

if_exists : {fail, replace, append}, default fail

How to behave if the table already exists.

fail: Raise a ValueError.

replace: Drop the table before inserting new values.

append: Insert new values to the existing table.

READ ALSO
Подскажите , почему z-index не работает?

Подскажите , почему z-index не работает?

В общем, есть такая структура html:

135
Как написать функцию для кнопки в React Js

Как написать функцию для кнопки в React Js

Для кнопки с HTML документа надо написать функцию для JS React которая считывает информацию с input type="text" и записывает в такую переменную

157
Подключение jQuery к html

Подключение jQuery к html

Пытаюсь подключить jQuery:

148