【问题标题】:How do I set attribute default values in sqlalchemy declarative?如何在 sqlalchemy 声明性中设置属性默认值?
【发布时间】:2012-11-03 07:31:27
【问题描述】:

在 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 文档,似乎没有一种明显的方法来检查类型/python 值,以便在自定义声明性基类中手动设置它。

【问题讨论】:

标签: python sqlalchemy


【解决方案1】:

为您的类添加一个构造函数并在那里设置默认值。从数据库加载行时构造函数不会运行,因此可以这样做。

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

SA Docs 中有类似方式使用__init__ 的示例。

【讨论】:

  • 如果要保证A 的实例具有word 的值,构造函数似乎比列定义中的默认值更好。有没有需要在两个地方都指定默认值的情况?
  • 答案似乎对我根本不起作用。它打印 None 并且永远不会调用 init
  • 实际模型类似乎没有调用声明性基础上的__init__
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多