Let's do an MCVE:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class A(Base):
    __tablename__ = 'a'
    id = Column(Integer, primary_key=True)
    end_date = Column(Date(),nullable=True)

e = create_engine("mysql://scott:tiger@localhost/test", echo=True)
Base.metadata.drop_all(e)
Base.metadata.create_all(e)


s = Session(e)
s.add(A(end_date=None))
s.commit()

print s.query(A.end_date).all()


on the Python side, the output is (after it checks for the table etc):

CREATE TABLE a (
        id INTEGER NOT NULL AUTO_INCREMENT,
        end_date DATE,
        PRIMARY KEY (id)
)


2016-06-14 08:39:17,680 INFO sqlalchemy.engine.base.Engine ()
2016-06-14 08:39:17,699 INFO sqlalchemy.engine.base.Engine COMMIT
2016-06-14 08:39:17,701 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2016-06-14 08:39:17,702 INFO sqlalchemy.engine.base.Engine INSERT INTO a (end_date) VALUES (%s)
2016-06-14 08:39:17,702 INFO sqlalchemy.engine.base.Engine (None,)
2016-06-14 08:39:17,703 INFO sqlalchemy.engine.base.Engine COMMIT
2016-06-14 08:39:17,708 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2016-06-14 08:39:17,708 INFO sqlalchemy.engine.base.Engine SELECT a.end_date AS a_end_date
FROM a
2016-06-14 08:39:17,709 INFO sqlalchemy.engine.base.Engine ()
[(None,)]

it's not actually possible to load a date of 0000-00-00 in Python, so making sure on the MySQL side:

[classic@photon2 sqlalchemy]$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.1.14-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [test]> select * from a;
+----+----------+
| id | end_date |
+----+----------+
|  1 | NULL     |
+----+----------+
1 row in set (0.00 sec)



so you'd want to check is:

1. does this test case do something different for you ? Can you modify it to show your result?

2. what version of MySQL / MariaDB is this?

3. what kinds of settings do you have for SQL_MODE , storage engine, etc. Is this definitely the type "DATE" ? (TIMESTAMP acts more unusually for example)

4. what database driver ?  (what version?)

5. etc. etc.


I can tell you right off that SQLAlchemy doesn't do anything with MySQL dates, they are passed through straight to the driver.

Looking over stackoverflow the main reason for this 0000-00-00 thing is people inserting invalid dates as strings. The MySQL python drivers should not be able to do that.








On 06/14/2016 07:20 AM, Marco Correia wrote:
Hi,

I have a date column which is optional, therefore I created it like this:

end_date = Column(Date(),nullable=True)

Apparently, if I do not specify the date, the database (mysql) stores
"0000-00-00". This is a problem later, when I do queries using clauses
like the following:

or_(Job.end_date.is_(None),Job.end_date>=date)

I find it a bit odd that when using sqlalchemy something that gets
stored as None is retrieved as 0000-00-00, so I guess I'm making some
mistake.

Trying to find a solution to this problem led me to do

end_date = Column(Date(),nullable=True,server_default=text("NULL"))

but it makes no difference.

Can someone help? Thanks!

Marco

--
You received this message because you are subscribed to the Google
Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to sqlalchemy+unsubscr...@googlegroups.com
<mailto:sqlalchemy+unsubscr...@googlegroups.com>.
To post to this group, send email to sqlalchemy@googlegroups.com
<mailto:sqlalchemy@googlegroups.com>.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to