python - 如何避免在数据库中创建“假”ID?
问题描述
我有将新记录推送到 db 到列信息的 python 代码。
try:
db.add_new_record(info)
except Exception as e:
log.error(e)
db.db.rollback()
continue
我使用标准 sql 查询
INSERT INTO mydb (info, desc) VALUES ('value1', 'value2')
Python:
import psycopg2
def add_new_record(self, info):
info['table'] = self.table
query = "INSERT INTO {table} (c1, c2) VALUES ('{val1}', '{val2}')".format(**self.make_dct(info))
self.make_execute(query)
self.db_commit()
return True
有时我会看到异常
exception: duplicate key value violates unique constraint "mydb_info_key"
这是正常的。
我计算数据库中的行数:25000 条记录。但我的最后一个 id 以 60000+ 开头。
Duplicate exception
记录新身份证?如何避免这种情况?
解决方案
还有另一个表mydb_seq
告诉 sql 下一个要使用的索引是什么(你可以看看它是什么SELECT * FROM mydb_seq;
)
在其他地方,您正在主动将 ID 设置为比此指针更高的值,因此有时此指针指向表中已存在的索引
您可以使用以下逻辑确定位置
首先找到next_id的指针
SELECT * FROM mydb_seq;
然后查询您的表以获取具有更大 id 的任何内容
SELECT id FROM mydb WHERE id > $next_id; // replace $next_id... with the value from above
顺便说一句,你真的 应该真正使用 cursor.execute 变量插入......你现在正在做的是疯狂,这会让你注入 sql
qry = "INSERT INTO {table} (field1,field2,field3) VALUES (%s,%s,%s)".format(table="my_db")
cursor.execute(query,(var1,var2,var3))
推荐阅读
- javascript - 如何在 React Native 中使用 viroReact?
- nest - Elasticsearch.NET 版本 7 - 如何检查索引是否存在
- android - 在 Android 9 及更高版本中,如何获取周围所有基站的 CID 和信号强度?
- android - 升级React Native后在android中继续获取资源链接失败
- python - 将键列表传递给字典进行修改
- elixir - `where` 中的值 `"user_id"` 不能在查询中强制转换为 :id 类型:
- postgis - 两个表之间的 Postgis ST_Intersects 真的(真的)很慢
- c++ - 在数据库中添加存储为字符串的两个时间值
- sql - Connecting to Azure SQL via R
- javascript - How do I unload components?