[英]SQLAlchemy/Pandas: Can not insert default time in MySQL
我使用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,我该如何处理?
使用SQLAlchemy时,您应该努力了解Python中发生了什么以及数据库中发生了什么。 与使用server_default
相比,在这里您使用default
参数定义了insert_time
的默认值,因此,如果未指定列的值,并且仅当您使用指定的模型时,该默认值就会添加到Python中的值中或基础Table
。
如果基于显示的模型创建表,则没有服务器端默认值,并且该列可为空。 这很重要,因为Pandas使用自己的元数据进行批量插入,因此它不知道您的Python端默认设置。
在MySQL中-根据版本和标志-与其他类型不同, TIMESTAMP
类型的列隐式为NOT NULL
并且第一个timestamp列的服务器端默认值为CURRENT_TIMESTAMP
,但如果未指定nullable=False
则SQLAlchemy显式发出NULL
指定符,为了使行为与其他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)
您可以使用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.