2014-01-30 169 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) 

演示:

>>> 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

稍後查詢... –

0

默認= randomword將解決這個問題,如果你想獲得不同的值每次執行傳遞一個可調用的函數。

對你沒有用處,但有另一個名爲'server_default'的默認值位於數據庫中。因此,即使您手動插入行,也會應用「server_default」。