你如何使用 kwargs 将字典中的 (k, v) 对映射到给定的 sqlalchemy table?

How do you use kwargs to map (k, v) pairs in a dict to a given sqlalchemy table?

如何使用 *args/**kwargs 将 (k, v) 对从给定的 Python 字典映射到 sqlalchemy Table 对象?

据我所知,从 sqlalchemy.ext.declarative.declarative_base 继承的 sqlalchemy 对象允许使用 kwargs 或通过一系列 setattr() 调用从字典绑定对象,如下所示:

report = session.query(Report).get(report_id)
for k, v in r.iteritems():
    setattr(report, k, v)

但是我的模型继承自 sqlalchemy.MetaData,如下所示,使用 sqlalchemy.orm 将 class 映射到给定的 table。如果这使事情复杂化,我愿意切换到低级别 API.

from sqlalchemy import Column, MetaData, Table, Integer, String, Date, orm
from sqlalchemy.dialects import postgresql

metadata = MetaData()

class Report(object):
    pass

reports_table = Table('reports', metadata,
                      Column('id', Integer, primary_key=True),
                      Column('probe_asn', String(8)),
                      Column('probe_cc', String(3)),
                      Column('probe_ip', String(40)),
                      Column('report', postgresql.JSON),

orm.mapper(Report, reports_table)

def create_all(engine):
    metadata.create_all(engine)

目前,我正在单独设置字典中的每个 属性,这可行,但是,这是不可取的。

def insert_reports(session, reports):
    """
    :param session: an instance of a given sqlalchemy session
    :param reports: an array of reports
    :return:
    """
    for report in reports:
        r = schema.Report()
        r.probe_asn = report['probe_asn']
        r.probe_cc = report['probe_cc']
        r.probe_ip = report['probe_ip']
        r.report = report['report']

        session.add(r)
    else:
        session.commit()

如何使用 *args/**kwargssetattr() 将给定的字典映射到给定的 sqlalchemy table 对象?

打开 report 字典应该可以解决问题:

session.add(schema.Report(**report))