sqlalchemy/pandas:不能在mysql中插入默认时间

f0ofjuux  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(310)

我用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)

看书桌,table insert_time 字段是 null 不是约会时间,我怎么处理?

um6iljoc

um6iljoc1#

在使用sqlalchemy时,您应该努力理解python中发生了什么以及数据库中发生了什么。这里定义了的默认值 insert_time 使用 default 参数,与使用 server_default ,因此,如果没有为列指定值,并且仅当您使用指定的模型或基础时,默认值才会添加到python中的值 Table .
如果您基于所显示的模型创建了表,则不存在服务器端默认值,并且该列可以为空。这很重要,因为pandas使用自己的元数据进行大容量插入,所以它不知道python端的默认值。
在mysql中-取决于版本和标志-类型为 TIMESTAMP 含蓄地 NOT NULL 与任何其他类型不同,第一个timestamp列的服务器端默认值为 CURRENT_TIMESTAMP 但是炼金术会释放出 NULL 显式说明符if nullable=False 未指定,以便使行为与其他dbms一致。
最后,您很可能打算传递函数 datetime.datetime.now 默认情况下,不是 datetime 在类构造过程中调用函数时得到:

insert_time = Column(TIMESTAMP(timezone=False),
                         default=datetime.datetime.now)  # Don't call it, pass it

如果使用如图所示的panda,还应显式指定服务器端默认值:


# 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)
wd2eg0qa

wd2eg0qa2#

可以使用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)

相关问题