我试图了解如何根据我的需要修改 to_sql 函数。这是数据框df_interface
:
| YEAR | QUARTER | USER_ACCOUNT | BYTES | USER_CODE |
|------|---------|--------------|---------------|-----------|
| 2020 | 2 | SHtte34 | 7392577516389 | 2320885 |
| 2020 | 2 | Exel2 | 441712306685 | 348995 |
我正在尝试将其插入表USER_USAGE
(通过oracle+cx和SQLAlchemy)。插入之前该表的内容是:
| YEAR | QUARTER | USER_ACCOUNT | BYTES | USER_CODE |
|------|---------|--------------|---------------|-----------|
| 2020 | 1 | SHtte34 | 34560 | 2320885 |
| 2020 | 1 | Exel2 | 5478290 | 348995 |
我希望仅在新季度和帐户的情况下插入新行。基本上我想在插入后这样:
| 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 |
附加更接近我想要看到的内容,但是如果我不小心运行该程序两次,我会看到重复的行:
| 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 |
如何使用“追加”功能,同时防止意外运行时创建重复项?
最佳答案
if_exists
参数引用整个表,而不是表中的各个行。 if_exists="replace"
表示“如果表存在,则删除它并使用 DataFrame 中的行创建一个新表,而 if_exists="append”
表示“附加DataFrame 行添加到现有表中”。
如果您只想将一些(或无)行插入到现有表中,则不能使用 to_sql
直接插入它们。相反,您可以:
• 创建一个与主 USER_USAGE
表结构相同的临时表(例如 USER_USAGE_TEMP
)。
• 使用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
)
关于python - Pandas to_sql - 追加与替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63992639/