Python 如何避免;假;在数据库中创建ids?
我有python代码,可以将新记录推送到db中的列信息中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
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,你是对的,谢谢。我会试试你的答案,非常感谢!