如何使用pymssql python INSERT但IGNORE相同的日期标记

时间:2016-09-25 20:01:23

标签: sql python-2.7 pymssql

我在导入数据时无法忽略重复的“日期”值

import pymssql
import datetime as dt

server = 'xx'
user = 'xx'
password = 'xx'
db = 'xx'
conn = pymssql.connect(server, user, password, db, as_dict=True)

cur = conn.cursor()
Table_create = 'CREATE TABLE table1 (t_date date, price FLOAT)'
cur.execute(Table_create)

today = str(dt.datetime.now().date())
yesterday = str(dt.datetime.now().date() - dt.timedelta(days=1))
nextday = str(dt.datetime.now().date() + dt.timedelta(days=1))
cur.executemany("INSERT  INTO table1(t_date, price) VALUES(%s,%d)", [(today, 100), (yesterday, 200)])
conn.commit()

我正在

In[78]: x
Out[78]: 
[{u'price': 100.0, u't_date': u'2016-09-25'},
 {u'price': 200.0, u't_date': u'2016-09-24'}]

如果我尝试再次插入它,我想忽略相同的日期记录,例如:

cur.executemany("INSERT  INTO table1(t_date, price) VALUES(%s,%d)", [(today, 100), (nextday, 200)])
conn.commit()

但我得到了重复,如:

In[80]: x
Out[80]: 
[{u'price': 100.0, u't_date': u'2016-09-25'},
 {u'price': 200.0, u't_date': u'2016-09-24'},
 {u'price': 100.0, u't_date': u'2016-09-25'},
 {u'price': 200.0, u't_date': u'2016-09-26'}]

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您有几个选项,您可以将日期作为主键,然后在任何重复条目上使用ON DUPLICATE KEY UPDATE更新价格

Table_create = '''CREATE TABLE table1 (t_date date PRIMARY KEY, price FLOAT )'''
cur.execute(Table_create)

today = str(dt.datetime.now().date())
yesterday = str(dt.datetime.now().date() - dt.timedelta(days=1))
nextday = str(dt.datetime.now().date() + dt.timedelta(days=1))
cur.executemany("INSERT  INTO table1(t_date, price) VALUES(%s, %s) on DUPLICATE KEY UPDATE price=price",([(today, 100), (yesterday, 200)]))

如果您恰好为现有行获取不同/新价格或为新日期执行插入,那只会更新价格

你也可以忽略任何重复:

"INSERT INSERT IGNORE INTO table1(t_date, price) VALUES(%s, %s)"

但是IGNORE会根据重复条目忽略IntegrityError以上,所以我个人更喜欢前者。

如果你想拥有一个auto_increment id,同时使用t_date和price,或者只使用t_date,那么另一个选择就是创建一个UNIQUE CONSTRAINT

  Table_create = '''CREATE TABLE table1 (
                            ID int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
                            t_date date,
                            price FLOAT,
                            CONSTRAINT no_dupes UNIQUE  (t_date, price))''' # CONSTRAINT no_dupes UNIQUE (t_date) for just the t_date
cur.execute(Table_create)

插入时会应用相同的逻辑。