Как обновить записи в MySQL с помощью SqlAlchemy python - PullRequest
0 голосов
/ 17 января 2020

поэтому я пытаюсь обновить записи в базе данных по идентификаторам.

  • Проблема в том, что он перезаписывает все строки `` `id and Cost`` последней строкой списка
  • Я не получаю никаких ошибок, но он должен соответствовать идентификатору тогда заменить только Cost

база данных:

table =

id             Cost
000074800795   157.05974458228403
000074801136   80.637745302714
000074801299    7
000074800300   13
000074800955   10

мой код:

df = pd.DataFrame({ "id": [000074800795 , 000074801136, 000074801299,000074800300, 000074800955] ,
                    "Cost" : [157.05974458228403 ,80.637745302714, 7, 13, 10] }) 

# replacing Null
df = df.where((pd.notnull(df)), None)

# reset index for For loop
df = df.reset_index()

df.id = df.id.astype(str)
#df.Cost = df.Cost.astype(str)

df.dtypes
out[101]: 
index  int64
id    object
Cost  object
dtype: object

values_list = []

for i in range(len(df)):
    values_list.append({ "id": df["id"][i] , 
                         "Cost": df["Cost"][i] ,
                       })

print(values_list[0:2])
[{'id': '000074800795', 'Cost': 157.05974458228403}, {'id': '000074801136', 'Cost': 80.637745302714}]

Загрузка в дБ.

  • Проблема в том, что он перезаписывает `` `id and Cost`` последней строкой списка

  • Я не получаю никаких ошибок, но он должен соответствовать идентификатору, затем заменить только Cost

engine = db.create_engine("my connection")

connection = engine.connect()
metadata = db.MetaData()

# Creating Table
data = db.Table('table', metadata, 
              db.Column('id', db.String(100), nullable=True),    
              db.Column('Cost', db.String(100), nullable=True),  
              extend_existing=True 
              )

metadata.create_all(engine)

query = db.update(data)
ResultProxy = connection.execute(query, values_list)

engine.dispose()

Выход:

table =

id             Cost
000074800955   10
000074800955   10
000074800955   10
000074800955   10
000074800955   10

1 Ответ

1 голос
/ 18 января 2020

Вы делаете импорт sqlalchemy как дБ? Кажется, вы думаете, что словарь может работать как словарь обновления первичного ключа, но я не думаю, что это так. Один из стандартных способов сделать это - docs и выглядит следующим образом:

table.update().where(table.c.id==7).values(name='foo')

Чтобы сделать это таким образом, вам нужно отфильтровать таблицу до одной строки, а затем запустить обновить в этой строке, используя данные в вашем фрейме данных. В противном случае, без запроса db.update обновит все в вашей таблице.

Попробуйте что-то вроде этого:

import pandas as pd
import sqlalchemy as db

metadata = db.MetaData()

table = db.Table('table', metadata,
                db.Column('id', db.String(100), nullable=True),
                db.Column('Cost', db.String(100), nullable=True),
                extend_existing=True
                )

df = pd.DataFrame({
    'id': ['000074800795', '000074801136', '000074801299', '000074800300', '000074800955'],
    'Cost': ['157.05974458228403', '80.637745302714', '7', '13', '10']
})

for index, row in df.iterrows():
    id_value = row['id']
    cost_value = row['Cost']
    table.update().where(table.c.id == id_value).values(Cost=cost_value)

Конечно, мы можем внести изменения в стиль, но, надеюсь, это направит вас в правильном направлении.

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