sqlalchemy pandas转化字典转为orm写入到sqlite数据库报错类型错误的解决办法
使用pandas读取csv数据,然后将其转化为字典,再写入到数据库的时候,数据库总是报错类型错误,于是转为orm之前,统一转化一下类型
from sqlalchemy import DECIMAL, Index, String, Date, Integer, Text, CHAR, SmallInteger, Float, Time, case, and_, extract, TypeDecorator
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.dialects.mysql import DATETIME
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy import func, case, inspect
def trans_orm_type(v, k_orm_type, k):
try:
if v is None or v == '':
return None
elif isinstance(k_orm_type, Date):
if isinstance(v, date):
return v
else:
if isinstance(v, datetime):
return v.date()
else:
if isinstance(v, int):
v = str(v)
elif isinstance(v, float):
v = str(int(v))
if len(v) == 6:
return parser.parse(v + '01').date()
else:
return parser.parse(v).date()
elif isinstance(k_orm_type, DATETIME):
if isinstance(v, date) or isinstance(v, datetime):
return v
else:
return parser.parse(v)
elif isinstance(k_orm_type, String):
if isinstance(v, str):
return v
else:
return str(v)
# SmallInteger 是 Integer的子类,所以判断逻辑需要放在Integer
elif isinstance(k_orm_type, SmallInteger):
if isinstance(v, int):
return v
else:
if v == '是':
return 1
elif v == '否':
return 0
else:
return int(v)
elif isinstance(k_orm_type, Integer):
if isinstance(v, int):
return v
else:
return int(v)
elif isinstance(k_orm_type, Float):
if isinstance(v, float):
return v
else:
return float(v)
else:
return v
except Exception as e:
print(e)
class Base(DeclarativeBase):
def all_columns(self):
return [getattr(self, c.name, None) for c in self.__table__.columns]
def to_dict(self):
return {c.name: getattr(self, c.name, None) for c in self.__table__.columns}
@classmethod
def from_dict(cls, data):
data = {k: trans_orm_type(v, cls.__table__.columns[k].type, k) for k, v in data.items() if k in cls.__table__.columns}
return cls(**data)
出处: https://www.cnblogs.com/meizhengchao/p/18302118
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(meizhengchao@qq.com)咨询.