你如何使用 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
/**kwargs
或 setattr()
将给定的字典映射到给定的 sqlalchemy table 对象?
打开 report
字典应该可以解决问题:
session.add(schema.Report(**report))
如何使用 *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
/**kwargs
或 setattr()
将给定的字典映射到给定的 sqlalchemy table 对象?
打开 report
字典应该可以解决问题:
session.add(schema.Report(**report))