首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用pyodbc executemany()处理主键约束冲突

如何使用pyodbc executemany()处理主键约束冲突
EN

Stack Overflow用户
提问于 2019-01-22 12:28:43
回答 1查看 1.6K关注 0票数 3

我有一个脚本可以使用DataFrame在表中插入executemany()

问题是,该表的ID为主键,有时可能会插入具有相同ID的行。

我想知道是否有一种简单的方法来处理这种异常并继续执行executemany()

我想的另一种方法是检查表中的所有IDs,并在插入数据库之前删除它们.但我不知道这会不会是表演..。

我的代码:

代码语言:javascript
运行
复制
params = (tuple(row) for _, row in df.iterrows())
sql = '''INSERT INTO stilingue.stalker_comments values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'''
start = time.time()
try:
    self.cursor.executemany(sql, params)
    self.conn.commit()
except Exception as e:
    print(e)
    self.conn.rollback()
    print('Something went wrong...')
end = time.time()
print('Execution time: {0:.2f} seconds.'.format(end-start))

DataFrame

代码语言:javascript
运行
复制
    channel followers   gender  hashtags    interactions    likes   location    mentions    name    page_comment    ... text    themes  uid user_image_url  user_url    username    verified    videoplays  business    rt_count
0   Inbox do Facebook   0   Não Definido        0   0           Midiam Mendes   False   ... Sacanagem isso né?? Poorq vocês dizeram que o ...       1995608377159933    https://storage.googleapis.com/usersstilingue/...           False   0   Itaú    0
1   Inbox do Facebook   0   Não Definido        0   0           Midiam Mendes   False   ... Eu tenho provas , e posso processar vocês!!     1995608377159933    https://storage.googleapis.com/usersstilingue/...           False   0   Itaú    0
2   Inbox do Facebook   0   Não Definido        0   0           Midiam Mendes   False   ... Isso é um absurdo       1995608377159933    https://storage.googleapis.com/usersstilingue/...           False   0   Itaú    0

回溯

代码语言:javascript
运行
复制
('23000', "[23000] [Microsoft][ODBC SQL Server Driver][SQL Server]Violation of PRIMARY KEY constraint 'PK__stalker___DD37D91A4691B0F7'. Cannot insert duplicate key in object 'stilingue.stalker_comments'. The duplicate key value is (m__g64-pbys7OlEvp8xmfyktlNIHrUPQPiNrcKrPVOF_Lj84OJfN4WtAJ92lj7YnzAOQ1B7EDCJf85k_UcwB0-4Q). (2627) (SQLExecDirectW); [23000] [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been terminated. (3621)")
EN

回答 1

Stack Overflow用户

发布于 2019-01-22 13:24:57

如果数据不是很大,最简单的方法是在数据库中创建一个没有PK的临时表。然后将数据插入到临时表中,从临时表中删除复制(如果您有server,可以使用以下语法删除复制),并将数据插入主表中。

代码语言:javascript
运行
复制
 WITH table_1 AS 
(SELECT *,RN=ROW_NUMBER() OVER(PARTITION BY [pk_field]
 order by date) 
 FROM [temporary_table])
 DELETE FROM table_1  WHERE RN>1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54308346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档