SQLAlchemy / Pandas: невозможно вставить время по умолчанию в MySQL - PullRequest
0 голосов
/ 14 сентября 2018

Я создаю таблицу, используя sqlalchemy, и я хочу установить временную метку по умолчанию в mysql, но она не может быть вставлена ​​в mysql, мой код:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer, Float, ForeignKey,TIMESTAMP

Base = declarative_base()
DBSession = sessionmaker(bind=engine)
session = DBSession()

class Book(Base):
    __tablename__ = 'book'
    bid = Column(Integer, primary_key=True)
    bname = Column(String(20))
    price = Column(Integer)

    student_id = Column(Integer, ForeignKey(Student.id))

    student = relationship(Student)
    insert_time = Column(TIMESTAMP(timezone=False),
                         default=datetime.datetime.now())

Base.metadata.create_all(engine)
books = pd.DataFrame({"bname": ['a','b','c','d'],
                      "price":[128,22,67,190],
                      'student_id':[1,1,3,2]})
books.to_sql('book',engine,if_exists='append',index=False)

посмотрите на таблицу книг, insert_time поле null, а не дата и время, как мне с этим справиться?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

При использовании 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)
0 голосов
/ 14 сентября 2018

Вы можете использовать экземпляр Datetime TIMESTAMP

import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer, Float, ForeignKey,DateTime

Base = declarative_base()
DBSession = sessionmaker(bind=engine)
session = DBSession()

class Book(Base):
    __tablename__ = 'book'
    bid = Column(Integer, primary_key=True)
    bname = Column(String(20))
    price = Column(Integer)

    student_id = Column(Integer, ForeignKey(Student.id))

    student = relationship(Student)
    insert_time = Column(Datetime,
                         default=datetime.datetime.now())

Base.metadata.create_all(engine)
books = pd.DataFrame({"bname": ['a','b','c','d'],
                      "price":[128,22,67,190],
                      'student_id':[1,1,3,2]})
books.to_sql('book',engine,if_exists='append',index=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...