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