Динамический поиск и изменение значения в таблице с помощью SQLAlchemy (ошибка setattr не может установить атрибут) - PullRequest
0 голосов
/ 31 августа 2018

Я новичок в python, SQLAlchemy и stackfoverflow (извините, если мой вопрос не ясен), стараюсь изо всех сил. Мой вопрос: как я могу динамически обновить значение в базе данных, через динамический фильтр. Я хочу остаться независимым от имени столбца. Я хочу, чтобы пользователь пропустил фильтр, чтобы найти строку и выражение, какое поле изменить. Идея состоит в том, чтобы создать универсальную функцию, которая делает это. У меня возникли проблемы с пониманием, как использовать для этого атрибут set или, может быть, есть другой способ Спасибо

Импорт:

from sqlalchemy.orm import (
    mapper,
    relationship,
    sessionmaker)
from sqlalchemy import *

Инициирование и подключение БД

initation = 'mysql+pymysql://user:password@localhost/km'

kmdb = create_engine( initation, pool_recycle=3600 )  # connect to server
kmdb.echo = False
Conn = kmdb.connect()
Meta = MetaData(bind=kmdb)


My_Session = sessionmaker()
My_Session.configure( bind=kmdb )
MySession=My_Session()

Описание таблицы:

country_hdl = Table( 'km_test_mapping', Meta,
                     Column( 'country_mapping_id', Integer, primary_key=True ),
                     Column( 'origin_client_id', String( 40 ) ),
                     Column( 'origin_source_id', String( 30 ) ),
                     Column( 'origin_cntrp_country', String( 30 ) ),
                     Column( 'som_cntrp_country', String( 30 ) ),
                     Column( 'can_use', Boolean ),
                     UniqueConstraint( 'origin_client_id', 'origin_source_id', 'origin_cntrp_country' )
                     )

# сопоставили таблицу с классом Country

class Country( object ):
    pass
mapper( Country, country_hdl )
cntry = Country()

# Передаваемые динамические переменные (фильтр и значение для изменения):

#I want to dynamically search for origin_client_id = MX01 and if found replace origin_client_id with CAL01. These values are passed as variables by user
    myfilter = {'origin_source_id': 'MX01’} 
    updatefieldvalue={'origin_client_id':'CAL01’} 

# Функция запроса:

query = MySession.query( country_hdl ).filter_by( **myfilter ) 
results = query.all()

# Замена поля (полей), если найдено:

if results:  
  for column,value in updatefieldvalue.items():  
    setattr(results[0],column,value)   

Ошибка:

Traceback (most recent call last):
File "/Users/gerardrafie/Developments/KPIMinds/sampleapp/db.py", 
line 63, in <module> . 
setattr(results[0],column,value) .  
AttributeError: can't set attribute . 

1 Ответ

0 голосов
/ 31 августа 2018

Запрашивая имя таблицы, вы запрашиваете статический набор результатов, который нельзя изменить. Однако, если вы сделаете запрос к сопоставленному классу (session.query(Country), вы сможете изменить результирующие объекты.

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