Python 如何将数据的时间窗口插入到与具有唯一约束的现有行部分重叠的表中
如何将数据的时间窗口插入到与具有唯一约束的现有行部分重叠的表中 下面是一段代码片段:Python 如何将数据的时间窗口插入到与具有唯一约束的现有行部分重叠的表中,python,mysql,Python,Mysql,如何将数据的时间窗口插入到与具有唯一约束的现有行部分重叠的表中 下面是一段代码片段: # Create the insert strings column_str = """data_vendor_id, symbol_id, price_date, created_date, last_updated_date, open_price, high_price, low_price, close_price, volume, adj_c
# Create the insert strings
column_str = """data_vendor_id, symbol_id, price_date, created_date,
last_updated_date, open_price, high_price, low_price,
close_price, volume, adj_close_price"""
insert_str = ("%s, " * 11)[:-2]
final_str = "INSERT INTO daily_price (%s) VALUES (%s)" % \
(column_str, insert_str)
当我现在调用它时,我得到了有意义的积分误差。理想情况下,它将允许新的行插入,并在冗余行上正常地失败。很遗憾,我的try/except块不允许合法行,导致整个查询失败:
for i, t in enumerate(tickers):
print(
"Adding data for %s: %s out of %s" %
(t[1], i+1, lentickers)
)
yf_data = price_retrieval.get_daily_historic_data_yahoo(t[1], start_date.timetuple())
try:
price_retrieval.insert_daily_data_into_db('1', t[0], yf_data)
except IntegrityError:
continue
有没有一种python或mysql解决方案可以使这种插入更具容错性 我的理解是,
price\u retrieval.insert\u daily\u data\u into\u db
插入了许多行,但是在第一个失败的行中断了吗?您需要使用try
来包装单个记录插入,而不是包装一组记录。您正在寻找插入忽略
或替换
,这取决于您希望如何处理重复数据
插入忽略如果要保留旧数据并丢弃新的重复数据,请使用
INSERT IGNORE
。这将把唯一的密钥冲突变成警告,所有不冲突的行都将正常处理。如果没有IGNORE
关键字,任何唯一的冲突都将中止整个INSERT
批处理
final_str = "INSERT IGNORE INTO daily_price (%s) VALUES (%s)" % \
(column_str, insert_str)
更换如果要用新的重复数据覆盖旧数据,则需要使用
REPLACE
语句,而不是INSERT
REPLACE
是SQL标准的特定于MySQL的扩展。它将插入不存在的行,如果遇到重复的行,它将首先删除旧行,然后插入新行
final_str = "REPLACE INTO daily_price (%s) VALUES (%s)" % \
(column_str, insert_str)
您所说的“不允许合法行”是什么意思?表上有哪些键,以及“部分重叠”是什么意思?唯一的约束是pricedate和ticker_id。部分重叠意味着我插入的某些行与以前的行冲突,而某些行是新行“合法行”。帕特里克斯的回答奏效了。谢谢