2014-01-30 5 views
1

Как создать другое значение по умолчанию для столбца в модели 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

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) 

Demo:

>>> 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'] 
+0

Странно. Любые предложения по отладке того, что происходит в моем случае? Благодарю. –

+0

@gablubablu Как вы выяснили, что вставленные значения абсолютно одинаковы? Запрошено через сеанс ORM или проверил dbms вручную? – yoloseem

+0

queried later ... –

0

по умолчанию = randomword будет решить эту проблему.

Не полезно для вас, но есть еще один по умолчанию «server_default», который находится в БД. Таким образом, даже если вы вручную вставляете строки, применяется «server_default».

Смежные вопросы