为什么我的 IdentitySet 只显示最后一项?
Why is my IdentitySet only showing the last item?
我有一个 pandas 系列并遍历所有项目。每个循环我检查一个条目是否已经存在,如果没有找到条目,将它们一个一个地添加到 sqlalchemy 会话中。循环完成后,我想检索在提交之前添加到会话中的项目数量。但是它只显示 IdentitySet 中的 1 个项目。提交会话时,所有项目都会插入到我的数据库中。
from datetime import datetime
from pandas import Series
from random import randint
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from .models import Alarm
engine = create_engine(...)
session = Session(engine)
series = Series(data=[randint(1, 10**3) for i in range(0, 12)],
index=[datetime(2020, i, 1) for i in range(1, 13)])
series.count() # Returns 12
for index, value in series.iteritems():
alarm = session.query(Alarm).filter_by(date=index.date()).first() # Returns None
if alarm:
continue
alarm = Alarm(date=index.date(), value=value)
session.add(alarm)
len(session.new) # Returns 1
session.commit() # Inserts 12 entries to database
所以问题似乎是您无法在将同一个变量添加到会话后覆盖它。
alarm = Alarm(date=date(2020, 12, 31), value=123)
session.add(alarm)
len(session.new) # Returns 1
alarm = None
len(session.new) # Returns 0
所以这应该可以解决我的问题:
alarms = []
for index, value in series.iteritems():
alarm = session.query(Alarm).filter_by(date=index.date()).first()
if alarm:
continue
alarms.append(Alarm(date=index.date(), value=value))
session.add_all(alarms)
没有列表 alarms
有更好的方法吗?
如果您将 echo=True
添加到 create_engine()
调用并查看正在发出的 SQL,您会注意到这些行被插入到 table 中遍历循环的时间。那是因为 session.query()
正在执行会话的隐式刷新以确保它获得最新的信息(例如,在多用户环境中可能需要)。
因此所有 12 个项目都被插入,但会话在给定时间从来没有超过一个新元素。
我有一个 pandas 系列并遍历所有项目。每个循环我检查一个条目是否已经存在,如果没有找到条目,将它们一个一个地添加到 sqlalchemy 会话中。循环完成后,我想检索在提交之前添加到会话中的项目数量。但是它只显示 IdentitySet 中的 1 个项目。提交会话时,所有项目都会插入到我的数据库中。
from datetime import datetime
from pandas import Series
from random import randint
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from .models import Alarm
engine = create_engine(...)
session = Session(engine)
series = Series(data=[randint(1, 10**3) for i in range(0, 12)],
index=[datetime(2020, i, 1) for i in range(1, 13)])
series.count() # Returns 12
for index, value in series.iteritems():
alarm = session.query(Alarm).filter_by(date=index.date()).first() # Returns None
if alarm:
continue
alarm = Alarm(date=index.date(), value=value)
session.add(alarm)
len(session.new) # Returns 1
session.commit() # Inserts 12 entries to database
所以问题似乎是您无法在将同一个变量添加到会话后覆盖它。
alarm = Alarm(date=date(2020, 12, 31), value=123)
session.add(alarm)
len(session.new) # Returns 1
alarm = None
len(session.new) # Returns 0
所以这应该可以解决我的问题:
alarms = []
for index, value in series.iteritems():
alarm = session.query(Alarm).filter_by(date=index.date()).first()
if alarm:
continue
alarms.append(Alarm(date=index.date(), value=value))
session.add_all(alarms)
没有列表 alarms
有更好的方法吗?
如果您将 echo=True
添加到 create_engine()
调用并查看正在发出的 SQL,您会注意到这些行被插入到 table 中遍历循环的时间。那是因为 session.query()
正在执行会话的隐式刷新以确保它获得最新的信息(例如,在多用户环境中可能需要)。
因此所有 12 个项目都被插入,但会话在给定时间从来没有超过一个新元素。