簡體   English   中英

SQLAlchemy / Pandas:無法在MySQL中插入默認時間

[英]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=FalseSQLAlchemy顯式發出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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM