我目前正在尝试找出在查询数据库时如何检查与结果代理关联的结果数。但是与结果代理对象关联的方法 rowcount 产生的结果我没什么意思:
import sqlalchemy as sql
# Creating the query.
s = sql.select([Observations.timestamp_dt]).where(Observations.ar_id == 2)
# Assuming that the session was already started, execute the statement.
rp = session.execute(s)
# Using rowcount.
rp.rowcount
>>> -1
然后,我检查了可能有用的信息,并发现了类似的question。但是,当我尝试实施建议的解决方案时,出现了一个错误:
# Checking how many rows are associated with rp.
rowcount = len(rp._saved_cursor._result.rows)
>>> AttributeError: 'sqlite3.Cursor' object has no attribute '_result'
help()函数或documentation并没有真正提供我可以用来获取该结果代理对象具有的行数的信息。我也尝试过:
rp._saved_cursor.rowcount
>>> -1
rp._saved_cursor.lastrowid
>>> 0
鉴于我需要知道需要越过该对象多少次,所以这没有帮助。
我想事先知道结果的数量的原因是这样,我可以知道要使用多少帧,并因此使用 rp.fetchone()的时间来将图像馈送到matplotlib FuncAnimation 。我正在寻找以下代码中分配给 frames 参数的数字:
def and_animation(ar_id, tstart, tstop):
# Making the session.
session = sup_unit.mainsession()
# Loading the mock data with the correct dimensions.
s = sql.select([ActiveRegion.columnshape, ActiveRegion.rowshape]).where(ActiveRegion.AR_id == ar_id)
dimensions = session.execute(s).fetchone()
# Load the data here.
s = sql.select([Observations.timestamp_dt, Observations.d4vm_vz]).where(sql.and_(Observations.ar_id == ar_id,
Observations.timestamp_int > tstart,
Observations.timestamp_int < tstop))
rp = session.execute(s)
files = rp.fetchall()
# Creating the figure objects.
fig, ax = plt.subplots(figsize=(14,8))
# Creating an image to start.
img = plt.imshow(ajuste(files[0][1], dimensions[0]), origin='lower',
cmap='RdBu',
vmax=1,vmin=-1 ,animated=True)
plt.colorbar(shrink=0.75)
def refresher(frame_number, img, files):
# Preparing the new data
new_data = ajuste(files[frame_number+1][1], dimensions[0])
#setting the new data
img.set_data(new_data)
plt.title(f'{files[frame_number][0]}')
return(img,)
ani = FuncAnimation(fig, refresher,
frames=range(len(files)-1), blit=True,
fargs = [img, files])
ani.save("vz.mp4")
#plt.show()
return
这样,而不是使用 rp.fetchall(),每次交互我都可以拍摄一张图像,从而避免了使用交换内存的过程,甚至在图像数量太大时也崩溃了。
谢谢。