【问题标题】:Is there a way to check and load missing data to SQL?有没有办法检查缺失的数据并将其加载到 SQL 中?
【发布时间】:2021-01-22 19:36:04
【问题描述】:

我正在尝试找出一种方法来检查我从数据帧加载到 SQL 表中的数据,以便加载丢失的数据并避免加载重复数据。

这是一个非常粗略的想法。

sql_data = []
data = [(2020-01-01, Monday, 20, 0.1), (2020-01-02, Tuesday, 12, 0.4), (2020-01-01, Wednesday, 26, 0.3)]
          
        
cursor.execute('''Select * FROM Table ''')
for row in cursor.fetchall():
   sql_data.append(row)
    
if data in sql_data:
   pass
else:
   query = '''INSERT INTO Table (Time, Day, Number, Decimal)
                                 VALUES (?, ?, ?, ?)'''
   cursor.execute(query, data)
   conn.commit()

【问题讨论】:

  • 您可以在表上设置唯一键约束,这将拒绝任何可能(尝试)加载的重复数据。此外,您可以尝试使用DataFrame.to_sql() 函数直接从DataFrame 加载数据。
  • 听起来你想做一个“upsert”。对该词的网络搜索应该会给你一些想法。
  • @GordThompson - 在我看来(并且可能误解了这个问题)OP 想要填补空白,而不是更新当前记录。

标签: python sql python-3.x list pyodbc


【解决方案1】:

考虑很少使用的 EXCEPT 子句(UNIONINTERSECT 集合运算符系列的一部分),因为 SQL Server 在没有 FROM 数据源的情况下支持 SELECT 中的标量值:

query = '''INSERT INTO Table (Time, Day, Number, Decimal)
           SELECT ?, ?, ?, ?
           EXCEPT
           SELECT Time, Day, Number, Decimal
           FROM Table
        '''
cursor.executemany(query, data)
conn.commit()

Online Demo

【讨论】:

  • 我试过了,但它返回了这个cursor.execute(query, list) pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near the keyword 'EXCEPT'. (156) (SQLExecDirectW); [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Statement(s) could not be prepared. (8180)")
  • 因为data 是一个元组列表,所以使用executemany。实际上应该引用您的日期字段,否则每个字段都被假定为减法的数学表达式。
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多