【问题标题】:Double inserting records in flask SqlAlchemy connected with PostgreSql?在与 PostgreSql 连接的烧瓶 SqlAlchemy 中双重插入记录?
【发布时间】:2018-09-06 10:26:11
【问题描述】:

很少,我遇到的问题是我插入到表 Tbl_CUSTOMER 的记录是双重的,来自 Postgres 的自动 ID。

我不知道,但我怀疑这可能是由于 postgres 真空运行时间引起的。为了确认这一点,我尝试在插入记录的同时运行 postgres Vacuum,但没有发现这个问题发生,因此,我无法复制问题以找出根本原因并解决问题。

models.py

class Tbl_CUSTOMER():
    ID              =   db.Column(db.Numeric(25, 9), primary_key=True, autoincrement=True)
    PotentialCustomer   =   db.Column(db.String(12))
    FirstNameEn     =   db.Column(db.String(35))
    LastNameEn      =   db.Column(db.String(35))
    FirstNameKh     =   db.Column(db.String(35))
    LastNameKh      =   db.Column(db.String(35))
    Salutation      =   db.Column(db.String(4))
    Gender          =   db.Column(db.String(6))
    DateOfBirth     =   db.Column(db.String(10))
    CountryOfBirth  =   db.Column(db.String(2))
    Nationality     =   db.Column(db.String(2))
    ProvinceOfBirth =   db.Column(db.String(3))

views.py

dataInsert =Tbl_CUSTOMER(
                PotentialCustomer   =   request.form['PotentialCustomer'],
                FirstNameEn     =   request.form['FirstNameEn'],
                LastNameEn      =   request.form['LastNameEn'],
                FirstNameKh     =   request.form['FirstNameKh'],
                LastNameKh      =   request.form['LastNameKh'],
                Salutation      =   request.form['Salutation'],
                Gender          =   request.form['Gender'],
                DateOfBirth     =   request.form['DateOfBirth'],
                CountryOfBirth  =   request.form['CountryOfBirth'],
                Nationality     =   request.form['Nationality'],
                ProvinceOfBirth =   request.form['ProvinceOfBirth']
            )

db.session.add(dataInsert)
db.session.commit()

这个问题不会经常发生。那么,问题是什么,我该如何解决这个问题以防止它在将来发生?谢谢。

【问题讨论】:

  • 我也不确定您为什么会遇到这个问题。在旁注中,如果表中只有一个 primary_key,您可以删除 autoincrement=True 它与 primary_key 一起提供。另外,我很好奇 ID 的类型应该是字符串还是整数,如果它是字符串,它应该增加什么。
  • @mad_ 感谢您的贡献,这对我和我的客户来说都很奇怪。另一方面,我无法删除自动 id,因为我们的应用程序单独实现了 id 模式。无法手动输入 ID。
  • 我无法理解如果您有自己的 ID,那么您希望 db 应该如何处理此列上的自动增量行为?
  • @mad_,我的应用程序依赖 postgres 来管理要保存的记录的自动 ID。我所说的 ID 模式是配置为带有两个特定前缀字母的日期/时间序列,例如。 'CUyymmdd`。每天可能有很多记录要保存。手动操作是不可能的。谢谢
  • 您对自动增量和从您的应用程序生成的 uuid 生成感到困惑。自动增量是 db 处理的东西,而不是你的应用程序。不建议创建手动 ID,它仍然会从您的应用功能生成。希望一切都有意义

标签: postgresql python-2.7 flask-sqlalchemy


【解决方案1】:

如果您使用基于行的所有值的散列函数值创建唯一键(或替换主键),这可能有助于您了解何时发生此问题。使用此散列列,您将能够决定当您的系统获得相同的值(相同的散列)时应该发生什么。例如,一种选择只是忽略新行,保留旧行。其他的,就是重写等等。

从不同行获得相同哈希值的机会非常小,我什至不会考虑。如果您想了解更多详细信息,请查看此线程 https://crypto.stackexchange.com/questions/1170/best-way-to-reduce-chance-of-hash-collisions-multiple-hashes-or-larger-hash

【讨论】:

  • 谢谢,是不是断定根本原因是因为主键?我没有为我的主键使用散列函数。
  • 可能根是一些线程进入另一个层,将同一行添加了两次。仅使用您发送的信息很难找出问题的原因。我猜这个问题与数据库本身无关。如果您在哈希上强制唯一并保持插入原样,您将获得一些错误跟踪,可以帮助您找出原因。我提出的更多是处理重复插入而不是避免它。
  • 对我来说,这是我的 IDE 中的一个“监视”调试表达式。表达式在每个断点处执行...
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多