如何为SQLAlchemy方言定制DateTime类型的参数绑定处理?
问题:SQLAlchemy DateTime类型跨方言兼容优化需求
原始代码与问题复现
创建表并插入数据的代码:
from sqlalchemy import Table, MetaData, Column, DateTime from datetime import datetime t = Table( "foo", MetaData(), Column("bar", DateTime()), ) engine.execute(t.insert((datetime(1900, 1, 1),))) engine.execute(t.insert(("1900-01-01",)))
上述代码中,最后一条插入语句在PostgreSQL中可正常执行,但在Spark等环境中会报错:
Cannot safely cast 'bar': string to timestamp [SQL: INSERT INTO TABLE `foo` VALUES (%(bar)s)] [parameters: {'bar': '1900-01-01'}]
当前自定义类型解决方案
可以通过自定义类型实现跨方言兼容:
from sqlalchemy import DateTime, TypeDecorator from datetime import datetime class MyDateTime(TypeDecorator): impl = DateTime def process_bind_param(self, value, dialect): if dialect.name == "hive" and isinstance(value, str): return datetime.strptime(value, "%Y-%m-%d") return value t = Table( "foo", MetaData(), Column("bar", MyDateTime()), )
但该方案存在两个问题:
- 直接判断方言名称的方式不够优雅
- 现有代码库大量使用DateTime类型,希望直接定制现有类型而非新建自定义类型
提问
请问SQLAlchemy是否支持直接定制现有类型的解决方案?
内容的提问来源于stack exchange,提问作者Anton Ovsyannikov
相关产品推荐
相关产品推荐

