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

Python SQLAlchemy/Pandas:无法在MySQL中插入默认时间,python,mysql,pandas,sqlalchemy,Python,Mysql,Pandas,Sqlalchemy,我使用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, Integ

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

查看book表,
insert\u time
字段是
null
,不是datetime,我如何处理它?

您可以使用时间戳的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)

您可以使用时间戳的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)

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

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

在MySQL中,根据版本和标志,类型为
TIMESTAMP
的列隐式地
不为NULL
与任何其他类型不同,并且第一个TIMESTAMP列的服务器端默认值为
CURRENT_TIMESTAMP
,但如果未指定
nullable=False
,为了使行为与其他DBMS一致

最后,您很可能希望传递函数
datetime.datetime.now
作为默认值,而不是调用函数时在类构造期间获得的
datetime
实例:

    insert_time = Column(TIMESTAMP(timezone=False),
                         default=datetime.datetime.now)  # Don't call it, pass it
如果使用熊猫,还应明确指定服务器端默认值,如图所示:

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

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

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

在MySQL中,根据版本和标志,类型为
TIMESTAMP
的列隐式地
不为NULL
与任何其他类型不同,并且第一个TIMESTAMP列的服务器端默认值为
CURRENT_TIMESTAMP
,但如果未指定
nullable=False
,为了使行为与其他DBMS一致

最后,您很可能希望传递函数
datetime.datetime.now
作为默认值,而不是调用函数时在类构造期间获得的
datetime
实例:

    insert_time = Column(TIMESTAMP(timezone=False),
                         default=datetime.datetime.now)  # Don't call it, pass it
如果使用熊猫,还应明确指定服务器端默认值,如图所示:

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

但是该列的(静态)默认值在pandas中未使用。但是该列的(静态)默认值在pandas中未使用。