attr: value
})
session.commit()
BaseModel.set_attr = set_attr
@classmethod
def set_attrs(cls, session, id, attrs):
if hasattr(cls, 'id'):
session.query(cls).filter(cls.id == id).update(attrs)
session.commit()
BaseModel.set_attrs = set_attrs
虽然很拙劣,但确实能用。顺便还附送了一些有用的玩意,你懂的。
2.设置 declarative_base() 的 cls 参数:
BaseModel = declarative_base(cls=ModelMixin)
这种方法不需要执行“BaseModel.get_by_id = get_by_id”之类的代码。不足之处就是 PyCharm 仍然无法找到这些方法的位置。
3.设置 __abstract__ 属性:
class BaseModel(BaseModel):
__abstract__ = True
__table_args__ = { # 可以省掉子类的 __table_args__ 了
'mysql_engine': 'InnoDB',
'mysql_charset': 'utf8'
}
# ...
这种方法最简单,也可以继承出多个类。
如何正确使用事务?
假设有一个简单的银行系统,一共两名用户:
class User(BaseModel):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
money = Column(DECIMAL(10, 2))
class TanseferLog(BaseModel):
__tablename__ = 'tansefer_log'
id = Column(Integer, primary_key=True)
from_user = Column(Integer, ForeignKey('user.id', ondelete='CASCADE', onupdate='CASCADE'))
to_user = Column(Integer, ForeignKey('user.id', ondelete='CASCADE', onupdate='CASCADE'))
amount = Column(DECIMAL(10, 2))
user = User(money=100)
session.add(user)
user = User(money=0)
session.add(user)
session.commit()
然后开两个 session,同时进行两次转账操作:
session1 = DB_Session()
session2 = DB_Session()
user1 = session1.query(User).get(1)
user2 = session1.query(User).get(2)
if user1.money >= 100:
user1.money -= 100
user2.money += 100
session1.add(TanseferLog(from_user=1, to_user=2, amount=100))
user1 = session2.query(User).get(1)
user2 = session2.query(User).get(2)
if user1.money >= 100:
user1.money -= 100
user2.money += 100
session2.add(TanseferLog(from_user=1, to_user=2, amount=100))










