如何插入但忽略与 pymssql 相同的日期标记 python
how to INSERT but IGNORE same date tag with pymssql python
我在导入数据时无法忽略重复的 'date' 值
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'}]
感谢帮助!
您有几个选择,您可以将日期设为主键,然后在任何重复条目上使用 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)]))
只有当您碰巧获得现有行的 different/new 价格或为新日期插入时才会更新价格
您也可以忽略任何重复项:
"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)
插入时同样的逻辑。
我在导入数据时无法忽略重复的 'date' 值
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'}]
感谢帮助!
您有几个选择,您可以将日期设为主键,然后在任何重复条目上使用 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)]))
只有当您碰巧获得现有行的 different/new 价格或为新日期插入时才会更新价格
您也可以忽略任何重复项:
"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)
插入时同样的逻辑。