sqlalchemy mysql python 解决方案及相关问题

三种sqlalchemy 连接方式

pip install pymysql  对应  "mysql+pymysql://...."

pip install mysqlclient对应 "mysql+mysqldb://...."

pip install mysql-connector对应 "mysql+mysqlconnector://...."

 

 

时间戳TimeStamp问题,直接使用sqlalchemy 中的TIMESTAMP作为Column类型参数,当上传会话时会报错类似'Timestamp' object has no attribute 'translate'.

所以如果直接使用pandas里自带的dataframe.to_sql,是无法使用的会报错。

此时,需要将时间数据类型由TimeStamp转为Datetime类型,t.to_pydatetime(),同时from sqlalchemy import Column, DateTime。

from sqlalchemy import Column, Integer, String, create_engine, ForeignKey, Sequence, DateTime
import sqlalchemy
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import pandas as pd
# import pymysql


# 创建对象的基类:
Base = declarative_base()

class StockListOrgin(Base):
    __tablename__ = 'stock_list_orgin'

    id = Column(String(30), Sequence('stock_list_id_seq'), primary_key=True, nullable=False, unique=True)
    display_name = Column(String(50))
    name = Column(String(20))
    start_date = Column(DateTime)
    end_date = Column(DateTime)
    stype = Column(String(20))


class SqlStock:
    def __init__(self, echo=True):
        src = "mysql+pymysql://localhost:3306/test"
        self.engine = create_engine(src, echo=echo)
        Base.metadata.create_all(self.engine)
        # 创建DBSession类型:
        DBSession = sessionmaker(bind=self.engine)
        # 创建session对象:
        self.session = DBSession()

    def __del__(self):
        self.session.close()

    """    def update_stocklist_pd(self, stockpd):
        stockpd.to_sql("stock_list_orgin", self.engine, if_exists="replace", index=False,
                       dtype={"display_name" : sqlalchemy.types.String(length=50),
                            "name" : sqlalchemy.types.String(length=20),
                            "start_date" : sqlalchemy.DateTime(),
                            "end_date" : sqlalchemy.DateTime(),
                            "type" : sqlalchemy.types.String(length=20)})"""

    def update_stocklist_pd(self, stockpd):

        for index in stockpd.index:
            display_name, name, start_date, end_date, stype = stockpd.loc[index]

            # 创建新对象:
            stock = StockListOrgin(id=index, display_name=display_name, name=name,
                                   start_date=start_date.to_pydatetime(), end_date=end_date.to_pydatetime(), stype=stype)
            # 添加到session:
            self.session.add(stock)
        # 提交即保存到数据库:
        self.session.commit()





以上start_date为TimeStamp类型

 

参考:

解决SQLAlchemy(Python)调用MySQL数据库时插入时间戳数据的问题https://blog.csdn.net/xiecheng1995/article/details/90900496

https://docs.sqlalchemy.org/en/13/core/tutorial.html

datetime,Timestamp和datetime64之间转换  https://www.cnblogs.com/nxf-rabbit75/p/11111825.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值