2016-09-25 44 views
1

我無法忽略重複的「日期」值,當我輸入數據如何插入而忽略與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'}] 

感謝您的幫助!

+0

使列唯一。 –

+0

@PadraicCunningham謝謝!唯一的問題是它會取消整個導入。我很感激像INNER JOIN這樣的東西,但是像我在示例中那樣使用「VALUES」這個調用,因爲你可能猜測我不是那裏最好的SQL人。 –

回答

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和價格或只是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) 

同樣的邏輯在插入時將適用另一種選擇。