1 回答

TA贡献1860条经验 获得超9个赞
通过使用一个带有子句的纯插入选择 SQL 查询来考虑try/except并避免所有查询构建和检查,因为这反映了非重复追加查询的需求。请参阅NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL。fetchIN
下面使用LIMIT 1替换fetchone(),否则使用TOP 1或fetch first 1 rows only取决于 RDBMS。此外,参数占位符使用%s,否则?根据 Python DB-API 使用。import在以后的帖子中,始终标记 RDBMS 并用线条显示 DB-API 。
def load_dim(instance):
sql = """INSERT INTO {dwh} ({dwh_cols})
SELECT {op_cols}
FROM {op}
WHERE {pk} NOT IN
(SELECT {pk} FROM {dwh} WHERE {pk} = %s)
LIMIT 1
"""
for key in instance.dim_id:
try:
# ID APPEND
dwh_cursor.execute(sql.format(dwh = instance.dwh_table_name,
dwh_cols = instance.dwh_args,
op_cols = instance.op_args,
op = instance.op_table_name,
pk = 'id'),
(str(key),))
dwh_connector.commit()
except Exception as e: # ADJUST TO DB-API SPECIFIC Error
# ORDER_ID APPEND
dwh_cursor.execute(sql.format(dwh = instance.dwh_table_name,
dwh_cols = instance.dwh_args,
op_cols = instance.op_args,
op = instance.op_table_name,
pk = 'order_id'),
(str(key),))
dwh_connector.commit()
billing_profile_op_id = dwh_cursor.lastrowid # RETURNS 0 IF NO DATA APPENDED
添加回答
举报