2011-03-25 26 views
2

我有这样的INSERT语句:我可以将INSERT语句拆分为几个而不重复插入行吗?

mtemp = "station, calendar, type, name, date, time" 
    query = "INSERT INTO table (%s) VALUES ('%s', '%s', '%s', %s, '%s', '%s');" 
    query = query % (mtemp, mstation, mcalendar, mtype, mname, mdate, mtime) 
    curs.execute(query,) 
    conn.commit() 

的问题是,我不能让这些变量:mcalendar,mdate,修改时间在此声明。它们不是不变的价值。我将不得不在forloop中访问它们中的每一个。但是,mstation,mtype和mname的值是固定的。我试图将INSERT语句拆分为几个:对于forloop中的三个变量中的每一个,以及对于单个forloop中的三个固定值中的一个。 forloop基本上是定义何时插入行。我有一个rows1列表和一个rows2列表,rows1是一个完整的记录列表,而rows2缺少一些列表。我正在检查rows1中是否存在rows2记录。如果是,则执行INSERT语句,如果不是,则不执行任何操作。

我跑的代码,并发现了两个问题:

  1. 比它应该是它的方式插入更多的行。它应该插入不超过240行,因为每个传感器每天只有240次发生。 (我想知道是不是因为我写了太多的循环以便插入行)。现在它有400多个新的行。
  2. 在这些新的行被插入到表中,他们只有在固定值的列中的值。对于我使用单个forloop插入数据的三个数据,他们根本没有任何价值。

希望这里有人给我一些提示。提前致谢!如果需要,我可以在此放置更多代码。我甚至不确定我是否在正确的轨道上。

+2

发布当前的代码可能会有所帮助 – 2011-03-25 04:59:17

+0

现在我有工作在同一个日期!我插入了一天所需要的所有行,以便每个传感器每天有240条记录。我想要做的就是让它每天都在工作。但是,如果我使用:在日期中的日期:....它重复循环为每个相同的日期,而不是不同的日期。我怎么能告诉它做的:日期不同的日期:...? – widget 2011-03-25 19:28:21

+0

请勿使用字符串格式化运算符('%')将参数放入查询中。请参阅http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters如何正确执行此操作。 – 2011-03-26 20:07:34

回答

1

我不知道我准确地了解您的情况,但这是那种你需要的东西?

伪代码

mstation = "foo" 
mtype = "bar" 
mname = "baz" 
mtemp = "station, calendar, type, name, date, time" 
queryTemplate = "INSERT INTO table (%s) VALUES ('%s', '%s', '%s', %s, '%s', '%s');" 
foreach (mcalendar in calendars) 
    foreach (mdate in dates) 
     foreach (mtime in times) 
      query = queryTemplate % (mtemp, mstation, mcalendar, mtype, mname, mdate, mtime) 
      curs.execute(query,) 
+0

有没有这样一个名为foreach的循环,或者你只是想'为所有人'...? – widget 2011-03-25 15:15:18

+0

我以前曾经使用过这个循环,但它运行得不好。这就是为什么我没有在这些代码中尝试它。无论如何,我会尝试 – widget 2011-03-25 15:35:02

1

一个INSERT语句总是对应于一个新行的表。 (当然,除非插入过程中出现错误。)您可以插入一行,然后稍后更新以添加/更改信息,但不存在拆分INSERT的情况。

如果你有一个需要不断变化的数据被执行多次的查询,最好的选择是一个prepared statement。准备好的语句“编译”SQL查询,但留下可在每次执行时设置的占位符。这可以提高性能,因为每次都不需要分析语句。你没有指定你用来连接到postgres的库,所以我不知道这个语法是什么,但是这是需要注意的地方。

如果你不能/不想使用准备好的语句,你必须只创建查询字符串一次,每次插入。不要在循环之前替换值,等到你在创建查询之前知道它们。

+0

只是一个方面说明:一个INSERT语句*可以*插入多行:'INSERT INTO t(id)VALUES(1),(2),(3)'将创建三行。使用'INSERT ... SELECT'也可以创建多行。 – 2011-03-25 07:31:39

+0

的语法是python。 – widget 2011-03-25 15:10:59

+0

你是对的。 一个INSERT语句总是对应于表中的一个新行。这句话很有意义。我通过编写一个单一的插入语句来完成工作。太棒了 – widget 2011-03-25 19:08:41

0

以下语法工作在SQL Server 2008中而不是在SQL Server 2005

CREATE TABLE Temp (id int, name varchar(10)); 

INSERT INTO Temp (id, name) VALUES (1, 'Anil'), (2, 'Ankur'), (3, 'Arjun'); 

SELECT * FROM Temp; 

id | name 
------------ 
1 | Anil 
2 | Ankur 
3 | Arjun  
相关问题