熊猫to_sql-附加与替换

时间:2020-09-21 12:50:57

标签: python pandas oracle sqlalchemy

我试图了解如何根据自己的需要修改to_sql函数。这是数据框df_interface

| YEAR | QUARTER | USER_ACCOUNT | BYTES         | USER_CODE |
|------|---------|--------------|---------------|-----------|
| 2020 | 2       | SHtte34      | 7392577516389 | 2320885   |
| 2020 | 2       | Exel2        | 441712306685  | 348995    |

我正在尝试通过oracle + cx和SQLAlchemy将其插入到表USER_USAGE中。插入之前该表的内容为:

| YEAR | QUARTER | USER_ACCOUNT | BYTES         | USER_CODE |
|------|---------|--------------|---------------|-----------|
| 2020 | 1       | SHtte34      | 34560         | 2320885   |
| 2020 | 1       | Exel2        | 5478290       | 348995    |

我只想在新的季度AND帐户的情况下插入新行。基本上,我在插入后会这样:

| YEAR | QUARTER | USER_ACCOUNT | BYTES         | USER_CODE |
|------|---------|--------------|---------------|-----------|
| 2020 | 1       | SHtte34      | 7392577516389 | 2320885   |
| 2020 | 1       | Exel2        | 5478290       | 348995    |
| 2020 | 2       | SHtte34      | 7392577516389 | 2320885   |
| 2020 | 2       | Exel2        | 441712306685  | 348995    |

以下是带有“替换”的代码:

conn = create_engine('oracle+cx_oracle://{}:{}@{}/?service_name={}'.format(s_uid,s_pwd,s_db,s_service))

df_interface.to_sql('USER_USAGE', conn, if_exists='replace',dtype={'USER_ACCOUNT': types.String(df_interface.USER_ACCOUNT.str.len().max()),'USER_CODE': types.String(df_interface.USER_CODE.str.len().max())},index=False)

这似乎也将删除上一季度(1)的值。替换后的输出:

 | YEAR | QUARTER | USER_ACCOUNT | BYTES         | USER_CODE |
|------|---------|--------------|---------------|-----------|
| 2020 | 2       | SHtte34      | 7392577516389 | 2320885   |
| 2020 | 2       | Exel2        | 441712306685  | 348995    |

Append更接近我想看到的内容,但是,如果我不小心运行了两次程序,则会看到重复的行:

| YEAR | QUARTER | USER_ACCOUNT | BYTES         | USER_CODE |
|------|---------|--------------|---------------|-----------|
| 2020 | 1       | SHtte34      | 7392577516389 | 2320885   |
| 2020 | 1       | Exel2        | 5478290       | 348995    |
| 2020 | 2       | SHtte34      | 7392577516389 | 2320885   |
| 2020 | 2       | Exel2        | 441712306685  | 348995    |
| 2020 | 1       | SHtte34      | 7392577516389 | 2320885   |
| 2020 | 1       | Exel2        | 5478290       | 348995    |
| 2020 | 2       | SHtte34      | 7392577516389 | 2320885   |
| 2020 | 2       | Exel2        | 441712306685  | 348995    |

我如何使用“附加”,还可以防止由于意外运行而创建重复项?

1 个答案:

答案 0 :(得分:1)

if_exists自变量引用整个表,而不是表中的单个行。 if_exists="replace"的意思是“如果该表存在,则将其删除并使用DataFrame中的行创建一个新表,而if_exists="append"的含义是“将DataFrame的行追加到现有表中”。

如果可能只想将某些(或不)任何行插入现有表中,则不能使用to_sql直接插入它们。相反,您可以:

•创建一个与主USER_USAGE_TEMP表具有相同结构的临时表(例如USER_USAGE)。

•使用to_sql将DataFrame上传到临时表(带有if_exists="append")。

•执行类似INSERT的语句

INSERT INTO USER_USAGE (YEAR, QUARTER, USER_ACCOUNT, BYTES, USER_CODE)
SELECT YEAR, QUARTER, USER_ACCOUNT, BYTES, USER_CODE FROM USER_USAGE_TEMP
WHERE NOT EXISTS (
    SELECT * FROM USER_USAGE UU
    WHERE UU.YEAR = USER_USAGE_TEMP.YEAR AND UU.QUARTER = USER_USAGE_TEMP.QUARTER
    )