簡體   English   中英

SQL 服務器如何更新如果存在否則由 Python 插入

[英]SQL Server how to UPDATE if exists else INSERT by Python

我在堆棧溢出中搜索了許多文章,但找不到滿足我要求的文章。 以下是我所指的。

更新如果存在,否則在 SQL 服務器 2008 中插入

我的要求使用 Python 創建 ETL 過程:從源中提取數據,轉換為 dataframe 然后上傳到 MS SQL 服務器。 如果找到具有相同 product_id 的重復行,則更新 SQL 數據庫,否則插入新行。

我的代碼

import pandas as pd
import pyodbc

# Import CSV
data = pd.read_csv(r'C:\Users\...\product.csv')
df = pd.DataFrame(data)
records = df.values.tolist()

# Connect to SQL Server
server = 'AAABBBCCC\SQLEXPRESS' 
database = 'abcdefg' 
username = 'User' 
password = '' 
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';Trusted_Connection=True;')
cursor = cnxn.cursor()

#Insert Data
sql_insert = '''
    UPDATE [atetestdb].[dbo].[products] 
    SET product_name = ?
    ,price = ?
    WHERE product_id = ?

    IF @@ROWCOUNT = 0
        INSERT INTO [atetestdb].[dbo].[products] 
            (product_id, product_name, price)
        VALUES (?, ?, ?)
'''

cursor.executemany(sql_insert, records)

cnxn.commit()

我的結果我得到的錯誤信息:

SQL 包含 6 個參數標記,但提供了 3 個參數

SQL 評論似乎有問題。 有人可以幫忙嗎? 任何其他滿足我要求的解決方案也值得贊賞。

我在 SQL 數據庫中的數據集

product_id 產品名稱 價格
1 桌子 1900
2 打印機 200
3 葯片 350
4 鍵盤 80
5 監視器 1200
6 桌子 900

csv 文件中的我的數據集

product_id 產品名稱 價格
5 監視器 600

將批次更改為每個參數都有局部變量,例如:

sql_insert = '''
    declare @product_name varchar(100) = ?
    declare @price decimal(10,2) = ?
    declare @product_id int = ?

    UPDATE [atetestdb].[dbo].[products] 
    SET product_name = @product_name, price = @price
    WHERE product_id = @product_id

    IF @@ROWCOUNT = 0
        INSERT INTO [atetestdb].[dbo].[products] 
            (product_id, product_name, price)
        VALUES (@product_id, @product_name, @price)
'''

您可以 go 進行簡單的 MERGE 語句。

MERGE [atetestdb].[dbo].[products] as t
USING (Values(?,?,?)) AS s(Product_name, price, product_id)
ON tgr.product_id = src.product_id 
WHEN MATCHED THEN UPDATE SET 
         t.product_name = s.product_name
    ,t.price = s.price
WHEN NOT MATCHED BY TARGET 
    THEN INSERT (Product_name, price, product_id)
         VALUES (s.Product_name, s.price, s.product_id)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM