python - Pandas to_sql - 追加与替换

标签 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    |

我正在尝试将其插入表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/

相关文章:

python - wxPython中帧之间的全局变量

python - Hadoop Streaming "comparator.options"未被尊重

python - 比较其他 Pandas 数据框每一行的值(value)

python - Pandas 日期时间日频率到周频率

python - 查找两个数据框中的共同元素

java - 使用 hibernate 与 oracle 的驱动程序连接问题

java - 通用连接池 java JDBC Oracle 12c 的应用程序连续性

Python PyQT - 网络浏览器 |书签

python - 在没有类实例的情况下访问类级别成员

sql - 使用 ROWNUM 时的区别