【发布时间】:2019-08-29 19:45:49
【问题描述】:
我正在使用dataclasses 与 SQLAlchemy 经典映射范例相结合。当我定义dataclass 并结合int 和str 字段的默认值时,SQLAlchemy 不会填充int 和strs,但它会填充List 和datetime 字段。比如下面的代码:
from dataclasses import dataclass, field
from typing import List
from datetime import datetime
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, ARRAY, TIMESTAMP
from sqlalchemy.orm import sessionmaker, mapper
metadata = MetaData()
person_table = \
Table('people', metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('name', String(255)),
Column('age', Integer),
Column('hobbies', ARRAY(String)),
Column('birthday', TIMESTAMP)
)
@dataclass
class Person:
id: int = None
name: str = ''
age: int = 0
hobbies: List[str] = field(default_factory=list)
birthday: datetime = field(default_factory=datetime)
mapper(Person, person_table)
engine = create_engine('postgresql://postgres@localhost:32771/test', echo=True)
metadata.create_all(engine)
session = sessionmaker(bind=engine)()
person = Person(id=None, name='Robby', age=33, hobbies=['golf', 'hiking'], birthday=datetime(1985, 7, 25))
session.add(person)
session.commit()
这会在内存中正确填充 person 对象,但 commit 操作会在 postgres 中生成以下数据(name 和 age 列是 null):
id | name | age | hobbies | birthday
----+------+-----+---------------+---------------------
1 | | | {golf,hiking} | 1985-07-25 00:00:00
如果我更改 Person 类以从 name 和 age 中删除默认值,那么数据会在 postgres 中正确填充:
@dataclass
class Person:
id: int = None
name: str
age: int
hobbies: List[str] = field(default_factory=list)
birthday: datetime = field(default_factory=datetime)
注意,我已经验证,当在类的“非默认”版本中创建 person 对象时,name 和 age 字段在内存中被正确填充。
如何将 SQLAlchemy 经典映射与具有默认值的数据类结合使用?
(Python 3.6、SQLAlchemy 1.2.16、PostgreSQL 11.2)
【问题讨论】:
-
这不是
default和server_default的区别吗? -
我也有类似的问题,谁能给点建议? stackoverflow.com/questions/67185813/…
标签: python postgresql sqlalchemy