При использовании SQLAlchemy вы должны стремиться понять, что происходит в Python, а что в базе данных.Здесь вы определили значение по умолчанию для insert_time
, используя аргумент default
, по сравнению с использованием server_default
, поэтому значение по умолчанию добавляется к значениям вPython , если не указано значение для столбца, и только если вы используете либо указанную модель, либо базовую Table
.
Если вы создали таблицу на основе показанной вами модели, тозначение по умолчанию на стороне сервера отсутствует, и столбец имеет значение NULL.Это важно, потому что Pandas выполняет массовую вставку, используя свои собственные метаданные, поэтому он не знает о вашей стороне по умолчанию на Python.
В MySQL - в зависимости от версии и флагов - столбец типа TIMESTAMP
неявно NOT NULL
отличается от любого другого типа, а в первом столбце отметки времени по умолчанию на стороне сервера задано значение CURRENT_TIMESTAMP
, но SQLAlchemy явно выдает спецификатор NULL
, если nullable=False
не указан, чтобы согласовать поведение с другими СУБД.
Наконец, вы, скорее всего, намеревались передать функцию datetime.datetime.now
какпо умолчанию, а не экземпляр datetime
, который вы получаете во время создания класса при вызове функции:
insert_time = Column(TIMESTAMP(timezone=False),
default=datetime.datetime.now) # Don't call it, pass it
Вы также должны явно указать значение по умолчанию на стороне сервера, если используете Pandas, как вы показали:
# Having `default` as well is a bit redundant.
insert_time = Column(TIMESTAMP(timezone=False),
default=datetime.datetime.now,
server_default=text('CURRENT_TIMESTAMP'),
nullable=False)