python - 如果行不存在,使用 Python 将数据更新到 mysql

标签 python mysql database import

上下文: 我在 mysql 数据库中有一个表,其格式如下。每行是一天的股价和成交量数据

Ticker,Date/Time,Open,High,Low,Close,Volume
AAA,7/15/2010,19.581,20.347,18.429,18.698,174100
AAA,7/16/2010,19.002,19.002,17.855,17.855,109200
BBB,7/19/2010,19.002,19.002,17.777,17.777,104900
BBB,7/19/2010,19.002,19.002,17.777,17.777,104900
CCC,7/19/2010,19.002,19.002,17.777,17.777,104900
....100000 rows

该表是通过从多个具有相同列和格式的 *.txt 文件导入数据来创建的。 *.txt 文件名与股票行情栏中的股票名称相同:即:导入 AAA.txt 获取 2 行 AAA 数据。

所有这些 *.txt 文件都是由检索我国股票价格的系统自动生成的。每天,股市收盘后,.txt 文件都会根据新一天的数据新增一行。

问题:每天,我如何将每个txt文件中的新行更新到数据库中,我不想每天加载mysql表中.txt文件中的所有数据,因为它需要很多时候,我只想加载新行。

我应该如何编写代码来完成这个更新任务。

最佳答案

(1) 创建/使用一个空的阶段表,没有主...:

 create table db.temporary_stage (
    ... same columns as your orginial table , but no constraints or keys or an index ....

 )

(2) # 这应该很快

  LOAD DATA INFILE 'data.txt' INTO TABLE db.temporary_stage;

(3) 连接 id,然后使用哈希函数消除所有未更改的行。以下可以做得更好,但总而言之,当您有很多行时,对数据库使用批量加载会快得多,这主要取决于数据库如何在内部移动内容。它可以一次全部进行维护,而不是一次进行一点点维护,效率更高。

   UPDATE mytable SET 
           mytable... = temporary_stage...
           precomputed_hash = hash(concat( .... ) )
   FROM
   ( 
            SELECT temporary_stage.* from mytable join 
               temporary_stage on mytable.id = temporary_state.id
               where  mytable.pre_computed_hash != hash(concat( .... ) ) ) 
     AS new_data on mytable.id = new_data.id

# clean up

DELETE FROM temporary_stage;

关于python - 如果行不存在,使用 Python 将数据更新到 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43641123/

相关文章:

mysql - 在这种情况下,MySQL INT 列的实际范围是多少?

mysql - 选择 if exist else insert?

mysql - 从一个表中加入两个 select 语句

python - ggplot模块已安装但无法导入

python - 为什么使用 Selenium webdriver 在我的 Mac 本地可以很好地执行 JS,但在 Docker 容器中却不行?

python - 哪些 svm python 模块使用 gpu?

python - 根据 Pandas 中的多索引条件/字符删除行

python - python2上的pip安装失败

mysql - SQL 查询,将表字段移动到列标题

database - 管理循环日历数据