首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLAlchemy/Pandas:无法在MySQL中插入默认时间

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

Stack Overflow用户
提问于 2018-09-14 07:49:38
回答 2查看 834关注 0票数 0

我使用sqlalchemy创建了一个表,我想在mysql中设置一个默认的时间戳,但是它不能插入mysql,我的代码:

代码语言:javascript
复制
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,而不是日期时间,我是如何处理它的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-14 10:41:48

在使用SQLAlchemy时,您应该努力理解Python中发生了什么以及数据库中发生了什么。与使用insert_time参数相比,这里使用default参数为server_default定义了默认值,因此,如果没有指定列的值,并且只有在使用指定的模型或基础Table时,默认值才会添加到server_default中。

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

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

最后,您最可能的目的是将函数datetime.datetime.now作为缺省值传递,而不是在调用函数时在类构造过程中获得的datetime实例:

代码语言:javascript
复制
    insert_time = Column(TIMESTAMP(timezone=False),
                         default=datetime.datetime.now)  # Don't call it, pass it

如果使用Pandas (如您所示),还应显式指定服务器端默认设置:

代码语言:javascript
复制
    # 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)
票数 2
EN

Stack Overflow用户

发布于 2018-09-14 10:21:36

您可以使用时间戳的Datetime实例。

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52327311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档