我有这样一个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,mtime。它们不是常数值。我必须在forloop中访问它们中的每一个。但是,mstation,mtype和mname的值是固定的。我试图将INSERT语句拆分为几个:一个用于forloop中的三个变量中的每一个,一个用于单个forloop中的三个固定值。 forloop基本上是定义何时插入行。我有一个rows1列表和一个rows2列表,rows1是一个完整的记录列表,而rows2缺少其中的一些。我正在检查rows1记录是否存在于rows1中。如果是,则执行INSERT语句,如果没有,则不执行任何操作。
我运行了代码,发现了两个问题:
希望有人在这里给我一些提示。提前致谢!如果需要,我可以在这里添加更多代码。我甚至不确定我是否在正确的轨道上。
答案 0 :(得分: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, )
答案 1 :(得分:1)
一个INSERT语句始终对应于表中的一个新行。 (当然除非在插入过程中出现错误。)您可以插入一行,然后稍后更新它以添加/更改信息,但不存在拆分INSERT这样的事情。
如果您的查询需要通过更改数据多次执行,则最佳选项为prepared statement。准备好的语句“编译”SQL查询,但留下可以在每次执行时设置的占位符。这样可以提高性能,因为每次都不需要解析语句。你没有指定你用来连接postgres的库,所以我不知道它的语法是什么,但它是值得注意的。
如果您不能/不想使用预准备语句,则必须为每个插入创建一次查询字符串。不要在循环之前替换值,等到创建查询之前全部知道它们。
答案 2 :(得分: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