如何使用pymssql python插入但忽略相同的日期标签

Posted

技术标签:

【中文标题】如何使用pymssql python插入但忽略相同的日期标签【英文标题】:how to INSERT but IGNORE same date tag with pymssql python 【发布时间】:2016-09-25 20:01:23 【问题描述】:

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

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']

感谢您的帮助!

【问题讨论】:

使列独一无二。 @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 和 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)

插入时也适用相同的逻辑。

【讨论】:

以上是关于如何使用pymssql python插入但忽略相同的日期标签的主要内容,如果未能解决你的问题,请参考以下文章

如何修复使用 pymssql 插入 sql DB 的错误

python中pymssql如何向sql server插入数据 插入的值可以用变量替换

使用 pymssql 将文本文件批量插入 SQL Server

通过pymssql插入但数据库中没有出现行

通过pymssql插入但数据库中没有出现行

python3.7 使用pymssql往sqlserver插入数据