通过SQLAlchemy动态搜索和修改表中的值(错误setattr不能设置attribute)

时间:2018-08-31 18:02:11

标签: python sqlalchemy

我是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' )
                     )

#映射表到国家(地区)类

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 :(得分:1)

通过查询表名,您正在查询无法更改的静态结果集。 但是,如果您查询映射的类(session.query(Country),则可以更改结果对象。