我有一个预定作业将解析以下CSV文件,如果服务器已在表中,则执行更新,如果没有,则插入。 (服务器名称是密钥)。
问题是CSV可能包含具有相同服务器但具有不同应用程序的行。在这些情况下,我必须进行更新,但保留应用程序的先前值。
如何在更新前保留以前的值?
server_name;ip_address;domain;application
s1;10.10.10.4;dom1;app1
s1;10.10.10.4;dom1;app2
s2;10.15.69.8;dom5;app10
s3;10.15.69.39;dom7;app5
我的代码就像($tab
包含我在桌面上的内容)
while(($line = fgetcsv($lines))!== false){
if (in_array($line[0],$tab)){ //update query}
else { //insert query }
}
答案 0 :(得分:0)
在临时停车表中导入csv rows值,然后对不在最终目标表中的行使用insert select
import statsmodels.formula.api as smf
lm = smf.ols(formula='Total_yield ~ Rain+ PH+EC', data=data).fit()
lm.summary()
adn使用其他人的更新
insert into your_final_dest (server_name,ip_address,domain,application)
select server_name,ip_address,domain,application
from your_csv_parking
where server_name not in ( select server_name from your_final_dest )
答案 1 :(得分:0)
你说这是预定的工作。因为这是一个重复的活动,所以建立一些基础设施是值得的:特别是一个外部表,为CSV文件提供SQL接口。
外部表非常简洁:它们是使用CREATE TABLE定义的,但我们指定了一个源文件(非常类似于SQL * Loader控制文件语法)而不是存储子句。然后我们可以查询CSV文件中的数据,而无需将其加载到临时表中。 Find out more。
关于插入和更新的问题,您应该查看MERGE语句。它在单个语句中处理INSERT和UPDATE。请注意,您可以使用外部表驱动MERGE:
merge into your_table
using ( select * from external_table ) ext
on ( your_table.server_name = ext.server_name )
when not matched
then insert values ( ext.server_name, ....)
when matched
then update set your_table.ip_address = ext.ip_address ....
我们可以将条件过滤器应用于INSERT和UPDATE子句。 Find out more