Sqlalchemy 为列设置不同的默认值

Sqlalchemy 为列设置不同的默认值,sqlalchemy,flask-sqlalchemy,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, de

如何为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())
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)
演示:

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)
演示:


default=randomword将解决此问题


这对您的情况没有用处,但是有另一个默认值叫做“server\u default”,它位于数据库中。因此,即使手动插入行,也会应用“server_default”

default=randomword将解决此问题


这对您的情况没有用处,但是有另一个默认值叫做“server\u default”,它位于数据库中。因此,即使手动插入行,也会应用“server_default”

奇怪。对如何调试我的案例有什么建议吗?谢谢。@Gablublu你怎么知道插入的值是完全相同的?通过ORM会话查询或手动检查dbms?@gablubablu尝试打印原始SQL。有一个
echo=True
选项用于
create\u engine()
来简单地配置放置调试日志。我尝试了您的示例。如果将default=randomword更改为default=randomword(),您也会看到问题。知道为什么吗?@Gablablu啊,这就是问题所在。由于该函数已被调用和求值,因此它不再是函数。由于计算了
default=randomword()
,SQLAlchemy将其理解为
default='somerandomword'
。为了将来的参考,我建议你编辑这个问题。对如何调试我的案例有什么建议吗?谢谢。@Gablublu你怎么知道插入的值是完全相同的?通过ORM会话查询或手动检查dbms?@gablubablu尝试打印原始SQL。有一个
echo=True
选项用于
create\u engine()
来简单地配置放置调试日志。我尝试了您的示例。如果将default=randomword更改为default=randomword(),您也会看到问题。知道为什么吗?@Gablablu啊,这就是问题所在。由于该函数已被调用和求值,因此它不再是函数。由于计算了
default=randomword()
,SQLAlchemy将其理解为
default='somerandomword'
。为了将来的参考,我建议你编辑这个问题。