【问题标题】:How do prevent insert multiple record into sql server via pyodbc?如何防止通过pyodbc将多条记录插入sql server?
【发布时间】:2019-11-25 12:37:49
【问题描述】:

如何防止插入重复数据和处理程序创建表错误。这是我的代码:

insert_query = '''INSERT INTO dbo.Tp_tabkeu(report_number,condition,power_error,status,Specification_dBM,CW_frequency) VALUES (?,?,?,?,?,?) 
    WHERE report_number!=values(a), condition!=values(b), power_error!=values(c), status!=values(d), Specification_dBM!=values(e), CW_frequency!=values(f);'''

    for index, row in df.iterrows():
        values = (row['report_num'], row['condition'], row[0], row[1], row[2], row[3])

【问题讨论】:

  • 您确定“WHERE”是“INSERT”sql 语句中的有效子句吗?
  • 无效,我试过INSERT IGNORE,也没有用。你有什么想法吗?
  • @Jovisch - 你在使用 Microsoft SQL Server 吗?
  • 是的,我用的是sql server。

标签: python sql sql-server pyodbc


【解决方案1】:

INSERT INTO ... VALUES ... WHERE ... 不是有效的语法。但是,您可以使用INSERT INTO ... SELECT ... WHERE ...

您已经确认您使用的是 SQL Server,并且df.iterrows() 表明您使用的是 pandas,因此您确实应该也使用SQLAlchemy。 (pandas 在使用 SQLite 以外的数据库时依赖于 SQLAlchemy。)

此示例对名为 [team] 的表执行条件 INSERT ...

prov  city     team_name  
----  -------  -----------
ON    Toronto  Maple Leafs

... 以 (prov, city) 作为主键。

import sqlalchemy as sa

# ...

engine = sa.create_engine(connection_url)

# ...

sql = sa.text("""\
INSERT INTO team (prov, city, team_name)
SELECT :prov AS prov, :city AS city, :team_name AS team_name
WHERE NOT EXISTS (
    SELECT * FROM team WHERE prov = :prov AND city = :city)
""")
params = {'prov': 'AB', 'city': 'Calgary', 'team_name': 'Flames'}
with engine.begin() as conn:
    conn.execute(sql, params)

【讨论】:

  • 嗨,很抱歉回复晚了。如果使用 sqlalchemy,与 pyodbc 相比,它向 sql server 插入值是否更快?此外,我有多个具有相同值的报告编号,所以上面的代码也可以工作吗?
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2018-03-26
  • 2021-09-19
  • 2014-08-20
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
相关资源
最近更新 更多