如何避免将数据从Python dataframe复制到SQL数据库SQLLite时出现重复?

如何避免将数据从Python dataframe复制到SQL数据库SQLLite时出现重复?,python,python-3.x,pandas,sqlite,pandasql,Python,Python 3.x,Pandas,Sqlite,Pandasql,我想在我使用SQL alchemy预先创建的sqltable中插入一个pandas数据帧 但是,这样做会得到重复,因为SQLite有一个索引列,当我从dataframe复制时,它会采用不同的索引,即使数据相同,它也可能会附加它 有关我的状态的详细信息: “我的熊猫”数据帧在插入时没有索引。(index=False)即使索引是主键,其余的数据也很重要。数据行不得重复,例如,每列的内容组合相同 我的SQL alchemy创建表:(来自database.py) 但是,我只希望在索引以外的行还不存在的情

我想在我使用SQL alchemy预先创建的sqltable中插入一个pandas数据帧

但是,这样做会得到重复,因为SQLite有一个索引列,当我从dataframe复制时,它会采用不同的索引,即使数据相同,它也可能会附加它

有关我的状态的详细信息:

“我的熊猫”数据帧在插入时没有索引。(index=False)即使索引是主键,其余的数据也很重要。数据行不得重复,例如,每列的内容组合相同

我的SQL alchemy创建表:(来自database.py)

但是,我只希望在索引以外的行还不存在的情况下插入sqltable。 但我发现我不知道如何将其应用于我的数据

 df.to_sql(
     name="sqltable", 
     con=engine,
     if_exists='replace',
     index=False,
     dtype={
         'index': sqlalchemy.types.INTEGER(),
         'A': sqlalchemy.types.INTEGER(),
         'B': sqlalchemy.types.VARCHAR(length=255),
         'C': sqlalchemy.types.BIGINT(),
         'D': sqlalchemy.types.VARCHAR(length=255),
         'E': sqlalchemy.types.VARCHAR(length=255),
         'F': sqlalchemy.types.Float(precision=3, asdecimal=True)
     }
 )  
如何进行索引? 最好的方法是什么


将新行插入SQL表的联机教程

将panda行作为占位符写入其他表

import pandas as pd

col_options = dict(
    dtype={
        'index': sqlalchemy.types.INTEGER(),
        'A': sqlalchemy.types.INTEGER(),
        'B': sqlalchemy.types.VARCHAR(length=255),
        'C': sqlalchemy.types.BIGINT(),
        'D': sqlalchemy.types.VARCHAR(length=255),
        'E': sqlalchemy.types.VARCHAR(length=255),
        'F': sqlalchemy.types.Float(precision=3, asdecimal=True)
    }
)
df.to_sql(name="sqltable_temp", con=engine, if_exists='replace', index=False, **col_options)  
将占位符表中的值与要写入新记录的表中的值进行比较时,仅检索新记录

query = """
    SELECT A, B, C, D, E, F FROM sqltable_temp 
    EXCEPT 
    SELECT A, B, C, D, E, F FROM sqltable;
"""

new_entries = pd.read_sql(query, con=engine, **col_options)
在表中追加新记录

new_entries.to_sql(
    name="sqltable", con=engine, if_exists='append', **col_options)
最后,删除占位符表

engine.execute("DROP TABLE sqltable_temp;")

当我将鼠标悬停在new_entries=pd上时,函数callpylint(意外的关键字arg)中出现意外的关键字参数“dtype”。在pd上读取sql(查询,**db_选项),似乎有错误。此外,sqltable_temp不会被擦除,即使我添加DROP TABLE sqltable_temp;我能做什么?我使用visualstudio代码编辑器。从新的_条目中似乎有一些不在,代码也不是从新条目中执行的。你能帮我吗?谢谢你指出这些错误<代码>数据类型不是数据帧的有效选项。请阅读sql。取出
con
选项字典并单独传递它也可以使用索引完成,因为它仍然没有处理和跳过行??代码在pd.read\u sql处停止,并且没有执行。你能帮帮我吗?没有更好的信息。你怎么确定它是在越界?是否提出了例外情况?当将
sqltable\u temp
sqltable
进行比较时,可能没有新的条目。您可以打印
new_entries
以查看它是否为空数据帧。您是否尝试过不使用行表_args={'sqlite_autoincrement':True}?它将始终自动增加索引,请参见:。我认为这不是你想要的行为。你的数据笑脸有多大?就我个人而言,我会使用一个存储过程和一个哈希函数来只引入增量,但我不认为你可以在SQL中使用存储过程?将在下面添加一个解决方案
engine.execute("DROP TABLE sqltable_temp;")