为列设置不同的默认值

时间:2014-01-30 13:30:48

标签: sqlalchemy flask-sqlalchemy

如何在SQLAlchemy模型中为列生成不同的默认值?在以下示例中,我为模型对象的每个新实例获取相同的默认值。

import random, string

def randomword():
    length = 10
    return ''.join(random.choice(string.lowercase) for i in range(length))

class ModelFoo(AppBase):
    temp = Column("temp", String, default=randomword())

2 个答案:

答案 0 :(得分:2)

default=randomword()错了。由于函数已经调用成为常量,因此它不再是函数。如果要在每次执行时获得不同的值,则传递可调用函数:

import random, string
from sqlalchemy import create_engine, Column, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()
engine = create_engine('sqlite:///foo.db')
Session = sessionmaker(bind=engine)
sess = Session()

def randomword():
    return ''.join(random.choice(string.lowercase) for i in xrange(10))

class Foo(Base):
    __tablename__ = 'foo'
    key = Column(String, primary_key=True, default=randomword)

Base.metadata.create_all(engine)

演示:

>>> sess.add(Foo())
>>> sess.add(Foo())
>>> sess.add(Foo())
>>> sess.flush()
>>> [foo.key for foo in sess.query(Foo)]
[u'aerpkwsaqx', u'cxnjlgrshh', u'dszcgrbfxn']

答案 1 :(得分:0)

默认= randomword将解决问题。

对你来说没用,但是还有另一个名为'server_default'的默认值,它位于数据库中。因此,即使您手动插入行,也会应用“server_default”。