SQLAlchemy / Pandas:无法在MySQL中插入默认时间

问题描述 投票:0回答:2

我使用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,不是datetime,我是如何处理它的?

python mysql pandas sqlalchemy
2个回答
2
投票

使用SQLAlchemy时,您应该努力了解Python中发生的事情以及数据库中的内容。在这里,您使用insert_time参数定义了default的默认值,与使用server_default相比,因此如果未指定列的值,则默认值将添加到Python中的值,并且仅当您使用指定的模型时或潜在的Table

如果您根据已显示的模型创建了表,则没有服务器端默认值,并且该列可以为空。这很重要,因为Pandas使用自己的元数据进行批量插入,因此它不知道您的Python端默认值。

在MySQL中 - 取决于版本和标志 - TIMESTAMP类型的列隐式NOT NULL不同于任何其他类型,第一个时间戳列的服务器端默认为CURRENT_TIMESTAMP,但是如果未指定SQLAlchemy emits the NULL specifier explicitly则为nullable=False,以使行为与其他DBMS。

最后,您最有可能将函数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
投票

您可以使用TIMESTAMP的Datetime实例

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)
© www.soinside.com 2019 - 2024. All rights reserved.