Python 如何在sqlalchemy声明中设置属性默认值?

Python 如何在sqlalchemy声明中设置属性默认值?,python,sqlalchemy,Python,Sqlalchemy,在SQLAlchemy声明中,如何设置列的默认值,以便瞬态或挂起的对象实例具有这些默认值?举个简单的例子: from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class A(Base): __tablename__ = "A" id = Column(Integer, prima

在SQLAlchemy声明中,如何设置列的默认值,以便瞬态或挂起的对象实例具有这些默认值?举个简单的例子:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class A(Base):
  __tablename__ = "A"
  id = Column(Integer, primary_key=True)
  word = Column(String, default="adefault")

a = A()
print a.word
天真地说,我会期望它的输出是
adefault
。当然,输出实际上是
None
。即使在添加到会话时,它仍然保持
None
,只有在我提交(或刷新)会话并从数据库中重新读取实例值时才会被填充


有没有办法在不将实例刷新到数据库的情况下设置属性默认值?我试图研究
ColumnDefault
文档,但似乎没有一种明显的方法来检查type/python值,以便在自定义声明性基类中手动设置它。

向类添加构造函数并在其中设置默认值。当从数据库中加载行时,构造函数不会运行,因此可以这样做

class A(Base):
    __tablename__ = "A"
    id = Column(Integer, primary_key=True)
    word = Column(String)

    def __init__(self):
        self.word = "adefault"

a = A()
print a.word

在中有一些使用
\uuuu init\uuuu
的示例。

如果要保证
A
的实例具有
word
的值,则构造函数似乎比列定义中的默认值更好。有没有一种情况需要在两个地方都指定默认值?答案似乎对我根本不起作用。它不会打印None,也不会调用init。对于实际的模型类,似乎不会调用声明性基础上的
\uuuu init\uuuu
。另请参见: