Sqlalchemy SQL炼金术,如何将数据插入两个表并引用外键?

Sqlalchemy SQL炼金术,如何将数据插入两个表并引用外键?,sqlalchemy,flask-sqlalchemy,python-3.5,Sqlalchemy,Flask Sqlalchemy,Python 3.5,我正在使用SQL Alchemy(通过Flask_sqlalchemy)将python词典列表插入Postgres数据库 其中一个表是所有唯一项目的列表(表1),而第二个表是与项目相关的数据时间序列(表2) 本质上,我希望在表1中插入任何新行(具有唯一散列),然后将其数据插入表2。如果它已经存在于表1中,只需在表2中插入“child”,引用表1中的条目即可 这是列表中的一项,列表中有几百项 {'placement': '5662448s608653114', 't1': datetime.dat

我正在使用SQL Alchemy(通过Flask_sqlalchemy)将python词典列表插入Postgres数据库

其中一个表是所有唯一项目的列表(表1),而第二个表是与项目相关的数据时间序列(表2)

本质上,我希望在表1中插入任何新行(具有唯一散列),然后将其数据插入表2。如果它已经存在于表1中,只需在表2中插入“child”,引用表1中的条目即可

这是列表中的一项,列表中有几百项

{'placement': '5662448s608653114', 't1': datetime.datetime(2018, 4, 15, 17, 47, 7, 434982), 't2': datetime.datetime(2018, 4, 25, 17, 47, 7, 434994), 'camp_id': 1, 'clicks': '0', 'visits': '3', 'conversions': '0', 'revenue': '0'}
我想将5662448s608653114插入表1,然后将所有其他数据插入表2,在这里我引用的不是5662448s608653114,而是表1中的id

所以我会得到:

表1:

____________________
1| 5662448s608653114
2| 5520103
表2:

ID | Pl id | T1 | T2 | cost | revenue | clicks
_______________________________________________
499| 1     |
500| 2     |
我对此进行了测试,但不起作用:

    def write_tracker_data(self):

    for item in self.data:
        ts = Placements(placement_ts_hash=item["placement"])
        pl = TrackerPlacementData(placement_id=ts.id, t1=item["t1"], t2=item["t2"], camp_id=1,  revenue=item["revenue"], clicks=item["clicks"], conversions=item["conversions"])
        db.session.add(pl)

    db.session.commit()
上面的代码插入数据,但没有数据,而是表1中的id。它似乎也不是很有效率,你知道当某件事肯定能以更好的方式完成时的感觉

以下是供参考的模型类:

class Placements(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    traffic_source = db.Column(db.Integer, db.ForeignKey('ts_types.id'))
    placement_ts_hash = db.Column(db.String, index=True)
    placement_url = db.Column(db.String)
    placement_type = db.Column(db.String)

    # Relationship betwwen unique placement table and tracker_placeemnt_data
    tracker_data = db.relationship("TrackerPlacementData", backref="placement_hash")

class TrackerPlacementData(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    t1 = db.Column(db.DateTime(timezone=True))
    t2 = db.Column(db.DateTime(timezone=True), index=True)
    camp_id = db.Column(db.Integer, db.ForeignKey('campaigns.id'), nullable=False)
    placement_id = db.Column(db.Integer, db.ForeignKey('placements.id'), nullable=True, index=True)
    revenue = db.Column(db.Float)
    clicks = db.Column(db.Integer)
    conversions = db.Column(db.Integer)
提前谢谢

编辑:这是可行的,但由于循环中的每个项目都有一个新的会话,所以看起来不是很好:/

def写入跟踪数据(自身):


您的
放置
实例在提交之前不会有id。这就是
tracker\u data
关系可以帮助您

for item in self.data:
    ts = Placements(placement_ts_hash=item["placement"])
    pl = TrackerPlacementData(
        t1=item["t1"], 
        t2=item["t2"], 
        camp_id=1, 
        revenue=item["revenue"], 
        clicks=item["clicks"], 
        conversions=item["conversions"]
    )
    ts.tracker_data.append(pl)
    db.session.add(ts)
db.session.commit()
请注意,
pl.placement\u id
未设置为任何值。相反,
pl
被附加到
ts.tracker\u data
中,当您调用commit时,应该为您处理好一切。

也许
flush()
是您所需要的,
for item in self.data:
    ts = Placements(placement_ts_hash=item["placement"])
    pl = TrackerPlacementData(
        t1=item["t1"], 
        t2=item["t2"], 
        camp_id=1, 
        revenue=item["revenue"], 
        clicks=item["clicks"], 
        conversions=item["conversions"]
    )
    ts.tracker_data.append(pl)
    db.session.add(ts)
db.session.commit()