Python 3.x 上传数据后提交错误

Python 3.x 上传数据后提交错误,python-3.x,pandas,flask,flask-sqlalchemy,Python 3.x,Pandas,Flask,Flask Sqlalchemy,我有一个简单的程序,在数据库中存储一些输入。我使用炼金术作为ORM,直到现在才有任何问题。由于一些问题,我不得不将数据保存到CSV文件并删除所有内容。之后,我使用df.to_sql方法从pandas再次上传了数据 注意:我正在使用df.to\u sql将以前保存的CSV加载回数据库。想法是恢复我存储的数据 现在,当我尝试使用我常用的方法(填写表单)上传数据并提交数据库中的更改时,一切恢复正常(或者我认为是这样),我得到以下错误: sqlalchemy.exc.IntegrityError: (p

我有一个简单的程序,在数据库中存储一些输入。我使用炼金术作为ORM,直到现在才有任何问题。由于一些问题,我不得不将数据保存到CSV文件并删除所有内容。之后,我使用
df.to_sql
方法从
pandas
再次上传了数据

注意:我正在使用df.to\u sql将以前保存的CSV加载回数据库。想法是恢复我存储的数据

现在,当我尝试使用我常用的方法(填写表单)上传数据并提交数据库中的更改时,一切恢复正常(或者我认为是这样),我得到以下错误:

sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) duplicate key violates \ 
uniqueness restriction
Detail: The key already exists (id) = (#).
每次我重复这个过程,错误都保持不变,只是
变为
+1
(例如:从2变为3,依此类推)

对不起我的英语,如果你需要任何澄清请问,我会尽量编辑这篇文章,我可以

谢谢你的时间

编辑1: 该过程正在向数据库添加新行并提交:

new_observation = Observations(var1 = new_var1, var2 = new_var2)
db.session.add(new_observation)
db.session.commit()
编辑2: 数据库的模型为:

class Observations(db.Model):
    __tablename__ = 'observations'
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.today())

    var1= db.Column(db.Numeric)
    var2= db.Column(db.Numeric)
编辑3: 根据mad_uu的建议,我尝试直接填充
主键

new_observation = Observations(primary_key = some_number, var1 = new_var1, var2 = new_var2)
db.session.add(new_observation)
db.session.commit()
现在的问题是我遇到了这个新错误:

sqlalchemy.orm.exc.FlushError: New instance <observations at 0x47deb50> \
      with identity key (<class 'app.models.observations '>, (368,), None) \
      conflicts with persistent instance <observations at 0x4ab8a90>
sqlalchemy.orm.exc.FlushError:新实例\
带有标识键(,(368,),无)\
与持久实例冲突

多亏@mad_uu的评论,我才得以解决我的问题。当我将一个表上传回数据库时出现了这个问题。当我尝试向DB提交一个新的观察结果时,我得到了一个错误


解决方法是显式声明
主键
。通过禁用
主键(
autoincrement=False
)的autoincrement属性,我得到了一个新的错误。您是在创建新表还是在添加新表?我正在向现有表添加一个新的观察值并提交。我添加了一个编辑。对不起,这很混乱。那么,您到底在哪里使用df.to_sql呢?如果要创建对象,应提及模型。该问题与唯一约束有关,该约束可能是
主键
。如果有人花时间,请尽量提供足够的材料。谢谢你,我对这方面还不熟悉。我已经对您请求的信息添加了一些编辑。默认情况下,id是自动递增的主键,因此它从索引1开始,因为您已经使用df.to_sql()填充了表,所以索引1已经存在。解决方法可以是从db中获取id的下一个值,并将其与var1和var2以及外键值一起传递。