MySQL datetime列WHERE col IS NULL失败
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL datetime列WHERE col IS NULL失败相关的知识,希望对你有一定的参考价值。
我无法让我的基本SQL查询工作,因为它返回0值,尽管有明显的空值
询问
SELECT
*
FROM
leads AS l
JOIN closes c ON l.id = c.lead_id
WHERE
c.close_date IS NULL
DDL
CREATE TABLE closes
(
id INT AUTO_INCREMENT
PRIMARY KEY,
lead_id INT NOT NULL,
close_date DATETIME NULL,
close_type VARCHAR(255) NULL,
primary_agent VARCHAR(255) NULL,
price FLOAT NULL,
gross_commission FLOAT NULL,
company_dollar FLOAT NULL,
address VARCHAR(255) NULL,
city VARCHAR(255) NULL,
state VARCHAR(10) NULL,
zip VARCHAR(10) NULL,
CONSTRAINT closes_ibfk_1
FOREIGN KEY (lead_id) REFERENCES leads (id)
)
ENGINE = InnoDB;
CREATE INDEX lead_id
ON closes (lead_id);
我应该提一下,我使用python web scraper和SQLAlchemy插入数据。如果数据没有被刮除,那么插入时将是None
。
这是datagrip的屏幕截图,显示行中的空值
编辑
好吧所以我继续在表格中的一些条目上运行以下内容,其中值已经是<null>
UPDATE closes
SET close_date = NULL
WHERE
lead_id = <INTEGERVAL>
;
现在有趣的是,在运行原始查询时,我确实返回了我运行更新查询的2条记录(预期结果)。这将使我相信问题与我的SQLAlchemy模型如何映射插入值有关。
models.朋友
class Close(db.Model, ItemMixin):
__tablename__ = 'closes'
id = db.Column(db.Integer, primary_key=True)
lead_id = db.Column(db.Integer, db.ForeignKey('leads.id'), nullable=False)
close_date = db.Column(db.DateTime)
close_type = db.Column(db.String(255))
primary_agent = db.Column(db.String(255))
price = db.Column(db.Float)
gross_commission = db.Column(db.Float)
company_dollar = db.Column(db.Float)
address = db.Column(db.String(255))
city = db.Column(db.String(255))
state = db.Column(db.String(10))
zip = db.Column(db.String(10))
def __init__(self, item):
self.build_from_item(item)
def build_from_item(self, item):
for k, v in item.items():
setattr(self, k, v)
但我相信,如果没有从网站上删除任何价值,价值就是蟒蛇None
。我的理解是SQLAlchemy会在插入时将None
映射到NULL
并且假设nullable=True
是默认设置,可以在生成的DDL上看到,我仍然不知道为什么它看起来像NULL
实际上它不是表现那样。
编辑2
只有我认为问题会发生的地方才是我的蜘蛛实际抓取数据并将其分配给Item
,如下所示
closes.py
# item['close_date'] = None at this point
try:
item['close_date'] = arrow.get(item['close_date'], 'MMM D, YYYY').format('YYYY-MM-DD')
except ParserError as e:
# Maybe item['close_date'] = None here?
spider.logger.error(f'Parse error: {item["close_date"]} - {e}')
在我写的python代码中,这似乎是问题出现的地方。但如果arrow.get
抛出一个例外,item['close_date']
的价值应该仍然是None
。如果不是这种情况,即使它不能解释为什么看起来记录值是NULL
甚至认为它不像它那样。
我猜你的连接有问题,而不是NULL值。以下查询为我返回1个结果。有关您的数据,用于查询的软件(我使用SQL Yog测试过)以及适用版本的更多信息可能有所帮助。
编辑
可能是你遇到了mysql'零日期'的问题。 qazxsw poi
MySQL允许您将“0000-00-00”的“零”值存储为“虚拟日期”。这在某些情况下比使用NULL值更方便,并且使用更少的数据和索引空间。要禁止'0000-00-00',请启用NO_ZERO_DATE模式。
我已经更新了下面的SQL数据,在INSERT和SELECT的WHERE中包含一个零日期。
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-types.html
以上是关于MySQL datetime列WHERE col IS NULL失败的主要内容,如果未能解决你的问题,请参考以下文章
在sql server 2008中如何查询本日、本周和本月数据