SQL Alchemy,如何向两个表中插入数据并引用外键?
SQL Alchemy, how to insert data into two tables and reference foreign key?
我正在使用 SQL Alchemy(通过 Flask_sqlalchemy)将 python 字典列表插入到 Postgres 数据库中。
其中一个 table 是所有唯一项目的列表 (table 1),而第二个是与项目相关的时间序列数据 (table2 ).
本质上,我想将任何新行(具有唯一哈希)插入到 table 1,然后将其数据插入到 table 2。如果它已经存在于 table 1,只需在 table 中插入 "child" 2 引用 table 中的条目 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 插入 table1,然后将所有其他数据插入 table2,其中我不是通过 5662448s608653114 引用该项目,而是通过它在 table 1
中的 id
所以我会得到:
Table 1:
____________________
1| 5662448s608653114
2| 5520103
Table 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()
上面的代码插入了数据,但是用none代替了Table1中的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 write_tracker_data(自己):
for item in self.data:
ts = Placements(placement_ts_hash=item["placement"])
db.session.add(ts)
db.session.commit()
pl = TrackerPlacementData(placement_hash=ts, 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()
您的 Placement
实例在提交之前不会有 ID。这就是 tracker_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_id
没有设置任何值。相反 pl
附加到 ts.tracker_data
并且当你调用 commit 时应该为你照顾一切。
我正在使用 SQL Alchemy(通过 Flask_sqlalchemy)将 python 字典列表插入到 Postgres 数据库中。
其中一个 table 是所有唯一项目的列表 (table 1),而第二个是与项目相关的时间序列数据 (table2 ).
本质上,我想将任何新行(具有唯一哈希)插入到 table 1,然后将其数据插入到 table 2。如果它已经存在于 table 1,只需在 table 中插入 "child" 2 引用 table 中的条目 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 插入 table1,然后将所有其他数据插入 table2,其中我不是通过 5662448s608653114 引用该项目,而是通过它在 table 1
中的 id所以我会得到:
Table 1:
____________________
1| 5662448s608653114
2| 5520103
Table 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()
上面的代码插入了数据,但是用none代替了Table1中的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 write_tracker_data(自己):
for item in self.data:
ts = Placements(placement_ts_hash=item["placement"])
db.session.add(ts)
db.session.commit()
pl = TrackerPlacementData(placement_hash=ts, 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()
您的 Placement
实例在提交之前不会有 ID。这就是 tracker_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_id
没有设置任何值。相反 pl
附加到 ts.tracker_data
并且当你调用 commit 时应该为你照顾一切。