Python 如何避免;假;在数据库中创建ids?

Python 如何避免;假;在数据库中创建ids?,python,postgresql,Python,Postgresql,我有python代码,可以将新记录推送到db中的列信息中 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', 'value

我有python代码,可以将新记录推送到db中的列信息中

   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"
这很正常

我以db:25000记录的形式计算行数。 但我的最后一个ID以60000+开始


重复异常
记录新id?如何避免这种情况

还有另一个表
mydb_-seq
告诉sql下一个要使用的索引是什么(您可以通过
SELECT*FROM mydb_-seq;
查看它是什么)

在其他地方,您正在积极地将ID设置为高于此指针的值,因此有时此指针指向表中已经存在的索引

您可以使用以下逻辑确定位置

首先找到下一个\u id的指针

SELECT * FROM mydb_seq;
然后查询表中任何id较大的内容

SELECT id FROM mydb WHERE id > $next_id;  // replace $next_id... with the value from above
顺便说一下,您应该真正地真正地使用游标。执行变量插入。。。你现在所做的是疯狂的,这会让你的sql注入

qry = "INSERT INTO {table} (field1,field2,field3) VALUES (%s,%s,%s)".format(table="my_db")
cursor.execute(query,(var1,var2,var3))

还有另一个表
mydb_-seq
告诉sql下一个要使用的索引是什么(您可以使用
SELECT*FROM mydb_-seq;
查看它是什么)

在其他地方,您正在积极地将ID设置为高于此指针的值,因此有时此指针指向表中已经存在的索引

您可以使用以下逻辑确定位置

首先找到下一个\u id的指针

SELECT * FROM mydb_seq;
然后查询表中任何id较大的内容

SELECT id FROM mydb WHERE id > $next_id;  // replace $next_id... with the value from above
顺便说一下,您应该真正地真正地使用游标。执行变量插入。。。你现在所做的是疯狂的,这会让你的sql注入

qry = "INSERT INTO {table} (field1,field2,field3) VALUES (%s,%s,%s)".format(table="my_db")
cursor.execute(query,(var1,var2,var3))

您对mydb的表定义是什么样的?@fixatd数据类型:字符变化,长度:1024,刻度:空,排序规则:pg_目录。“默认”,统计信息:-1,存储:ExtendeDanique约束公共。mytable\u mycolumn\u键自动
mydb
的表定义是什么样子?@fixatd数据类型:字符变化,长度:1024,比例:空,排序规则:pg\u目录。“默认”,统计信息:-1,存储:ExtendeDanique约束公共。mytable\u mycolumn\u键自动是我做的:def make\u执行(self,query):self.cursor.execute(query)no您不需要…您正在进行正常的字符串替换,这在我看来是
query=“插入到{table}(c1,c2)值('{val1}','{val2}')”。格式(**self.make\dct(info))
会让你被黑客攻击的!你对变量的看法是对的,谢谢。我会尝试你的答案,非常感谢!是的,我会:def make_execute(self,query):self.cursor.execute(query)不,你不会…你在做正常的字符串替换,这在我看来是
query=“插入到{table}(c1,c2)值('{val1}',val2}')。格式(**self.make_dct(info))
会让你被黑客攻击的!关于VAR,你是对的,谢谢。我会试试你的答案,非常感谢!