簡體   English   中英

使用python通過SQLAlchemy引擎將panda數據幀更新到SQL Server

[英]Update panda dataframe to SQL Server though SQLAlchemy engine using python

我有一個現有的 SQL Server 數據庫。 我想使用 python 從 CSV 文件中讀取並將與 TIMEID 列匹配的列值更新到 SQL Server 表中

如果我在 SQL Server 中執行此操作,我會將新的 CSV 加載到新表中,然后使用以下方法進行更新:

UPDATE R 
SET R.[PA]=P.[PA]
FROM [DATABASE_TABLE] AS R
INNER JOIN [NEW_CSV] AS P 
       ON R.[TIMEID] = P.[TIMEID] 
WHERE R.[TIMEID] like '20180201%' //i can survive now without the where, and update everything from the CSV. 

對 python 來說很新,所以請原諒我。 我已成功將 CSV 文件加載到熊貓數據框中,並且我能夠將新行插入 SQL Server,但我無法管理更新(到現有列或空列)。

import pandas as pd 
from sqlalchemy import create_engine
engine = create_engine("BLOCKOUTFOR PASSWORD")
query="SELECT * FROM [DATABASE].[TABLE]"
df = pd.read_sql_query(query, engine)
display(df) #This is just to display the current data

    TIMEID  DATEID  HOUR    DOW FESTIVAL    PA  PB  PC  P31A    PX  PY  P_TOT
0   20180101H01 2018-01-01  01  2   N   0.4615  0.0570  0.4427  0.0153  None    None    0.9765
1   20180101H02 2018-01-01  02  2   N   0.4112  0.0516  0.4074  0.0154  None    None    0.8856

#Convert Type and Load CSV into df3
def dfReadCSV( Path, Ind):
    df =pd.read_csv(Path,dtype={'DATEID':str,'Hour':str},parse_dates= ['DATEID'])
    df1=df[Ind:]
    return df1
df3=dfReadCSV("C5Liq_2018Test.csv",0)

display(df3) #if there is a neater way to do this it be appreciated, but not critical 

    Attribute   TIMEID  DATEID  Hour    DOW 20A 20DHA   21A 21DHA   30A 31A PA  PB  PC  P31A    P_TOT
0   H01 20180101H01 2018-01-01  01  1   0.2953  0.0158  0.1662  0.0412  0.4427  0.0153  0.4615  0.0570  0.4427  0.0153  0.9765
1   H02 20180101H02 2018-01-01  02  1   0.2711  0.0160  0.1401  0.0356  0.4074  0.0154  0.4112  0.0516  0.4074  0.0154  0.8856

#Insert Function
connStr= engine.connect().connection
cursor = connStr.cursor()

for index,row in df3.iterrows():
    cursor.execute('INSERT INTO [DATABASE].[TABLE]([TIMEID],[DATEID],[Hour],[DOW]) values (?,?,?,?)', row['TIMEID'], row['DATEID'], row['Hour'], row['DOW']) 
    connStr.commit()

cursor.close()
connStr.close()

#Update Function. This is where i have problem.
connStr= engine.connect().connection
cursor = connStr.cursor()

for row in df3.iterrows():
    #sql = 'UPDATE [DATABASE].[TABLE] SET [DATEID]=? WHERE [TIMEID]=?'.format(tbl=[DATABASE].[TABLE])
   cursor.execute("UPDATE [DATABASE].[TABLE]  SET [DATEID] = ? WHERE [TIMEID] = ?", row[:,0],row[;,0])  

cursor.close()
connStr.close()

語法錯誤,我無法弄清楚。 最好我喜歡有一個類似的方法來更新如上所述。 CSV 中的數據得到更新,我想將這些信息更新到我的 SQL Server 表中。

我找到了一個類似的線程,但也沒有找到答案: 使用數據幀通過 SQLAlchemy 更新 MSSQL 表

作為那里的線程啟動器,我也無法刪除表,因為我在新數據列(例如 PX)中加載的新 CSV 可能沒有先前插入 (PA) 的一些信息。

有兩種方法可以進行您想要的更新:

1)直接在數據庫上:

upd = (session.query(TABLE)
       .filter(TIMEID = row[:,0])
       .update({"DATEID": row[:,0]})
       )
print("# of updated rows = {}".format(upd))
# session.commit()

2)加載對象,更新值,並提交會話

upd = (session.query(TABLE)
       .filter(TIMEID = row[:,0])
       )

# assuming there should be exactly one object for given TIMEID
DATEID= upd.one()
DATEID.time_out = datetime.datetime.now()
session.commit()

您可以獲得更多信息

我不推薦 sqlachemy 進行更新。 它有利於批量插入

對於 sqlalchemy

import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('postgresql+psycopg2://postgres:password@host:port/database')
print(engine)
truncate_query = "SELECT * from something.something"
df = pd.read_sql_query(truncate_query , engine)

經過數小時的搜索,我找到了解決方案的答案:

更新功能

connStr= engine.connect().connection
cursor = connStr.cursor()

for index, row in df3.iterrows():
    cursor.execute('''UPDATE [DATABASE].[TABLE] SET [Hour] = ? WHERE [TIMEID] = ?''', (row['Hour'],row['TIMEID']))  
    connStr.commit()
    

cursor.close()
connStr.close()

經過數小時的嘗試,這是一個直接的語法錯誤。

我仍然喜歡聽聽如何使用 session.query 方法獲得解決方案。

而且我確定如果進行一些錯誤檢查,我上面的代碼是否會更好。 同時,如果有人可以解釋為什么沒有“索引”的循環失敗以及它意味着什么?

for index, row in df3.iterrows():

累但興奮。

暫無
暫無

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

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