我试图了解如何根据自己的需要修改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 |
我如何使用“附加”,还可以防止由于意外运行而创建重复项?
答案 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
)