sqlalchemy反射表和字符串字段默认值的问题

0 投票
2 回答
926 浏览
提问于 2025-04-15 17:51

嗯,有没有什么原因让sa在数据库表结构中已经设置了默认值的varchar列上尝试添加None值呢?对于浮点数或整数,它就不会这样做(我是在用反射)。

所以当我尝试添加新行时,比如:

u = User()
u.foo = 'a'
u.bar = 'b'

sa会发出一个查询,其中有很多列被赋值为None,而数据库显然会拒绝这个操作,并且不会用默认值替代这些None。

2 个回答

2

你用的是什么版本,实际的代码是什么样的呢?下面有一段示例代码,展示了 server_default 参数在字符串字段中是怎么正常工作的:

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

metadata = MetaData()
Base = declarative_base(metadata=metadata)

class Item(Base):
    __tablename__="items"
    id = Column(String, primary_key=True)
    int_val = Column(Integer, nullable=False, server_default='123')
    str_val = Column(String, nullable=False, server_default='abc')

engine = create_engine('sqlite://', echo=True)
metadata.create_all(engine)
session = sessionmaker(engine)()

item = Item(id='foo')
session.add(item)
session.commit()
print item.int_val, item.str_val

输出结果是:

<...>
<...> INSERT INTO items (id) VALUES (?)
<...> ['foo']
<...>
123 abc
0

我发现这是sa中的一个bug,这个问题只出现在字符串字段上,出于某种未知原因,它们没有获得server_default属性。我已经为此提交了一个工单。

撰写回答