python数据库中计算_python – 更新sqlalchemy中具有计算列的表

在 SQLAlchemy 中,当尝试更新包含计算列的 MSSQL 数据库表时遇到问题。尽管使用 hybrid_property 将计算列设为只读,但在插入新记录时,SQLAlchemy 仍尝试为这些列赋值。示例代码展示了如何定义计算列以及添加新记录的过程,但问题在于 hybrid_property 的设置似乎并未阻止 INSERT 语句填充计算列。解决方案是利用 SQLAlchemy 的 FetchedValue(),通过示例展示了如何正确创建和操作包含计算列的表。
摘要由CSDN通过智能技术生成

我正在使用SQLalchemy在遗留的MSSQL数据库中工作,我有一个声明性映射.

该数据库有几个具有计算列的表.我可以读得很好,但(当然)写入计算列不起作用.但是,当我创建并尝试保存ORM对象时,SQLAlchemy仍尝试在这些列中保存“无”值,从而导致错误.

我在网上发现了一些应该通过使用SQLAlchemy的hybrid_property装饰器使特定列“只读”的示例,但即使在实现之后,也会出现同样的错误(“tlog_real_timehh”列无法修改,因为它是计算列或者是UNION操作符的结果.)仍然出现.

代码如下 – 映射:

class transactionlog(Base):

__tablename__ = 'transactionlog'

tlog_id = Column(VARCHAR(length=36), primary_key=True, nullable=False)

tlog_ppl_id = Column(VARCHAR(length=36), ForeignKey('people.ppl_id'))

tlog_evtt_id = Column(VARCHAR(length=5))

tlog_testrun = Column(BIT())

tlog_Data = Column(NVARCHAR(length=300))

tlog_price = Column(DECIMAL(precision=18, scale=2))

tlog_comment = Column(NVARCHAR(length=1000))

_tlog_real_timehh = Column('tlog_real_timehh', INTEGER())

_tlog_real_timemm = Column('tlog_real_timemm', INTEGER())

_tlog_real_timess = Column('tlog_real_timess', INTEGER())

_tlog_fin_booking = Column('tlog_fin_booking', BIT())

@hybrid_property

def tlog_real_timehh(self):

return self._tlog_real_timehh

@tlog_real_timehh.setter

def tlog_real_timehh(self, tlog_real_timehh):

self._tlog_real_timehh = tlog_real_timehh

@hybrid_property

def tlog_real_timemm(self):

return self._tlog_real_timemm

@tlog_real_timemm.setter

def tlog_real_timemm(self, tlog_real_timemm):

self._tlog_real_timemm = tlog_real_timemm

@hybrid_property

def tlog_real_timess(self):

return self._tlog_real_timess

@tlog_real_timess.setter

def tlog_real_timess(self, tlog_real_timess):

self._tlog_real_timess = tlog_real_timess

@hybrid_property

def tlog_fin_booking(self):

return self._tlog_fin_booking

@tlog_fin_booking.setter

def tlog_fin_booking(self, tlog_fin_booking):

self._tlog_fin_booking = tlog_fin_booking

以及应该添加新记录的代码:

rem = Transactionlog()

rem.tlog_testrun = 0

rem.tlog_evtt_id = 'rem'

rem.tlog_Data = None

rem.tlog_comment = 'reminder'

rem.tlog_price = 0

db.session.add(rem)

db.session.flush()

我希望hybrid_property代码使计算字段成为只读,但似乎SQLAlchemy仍然试图根据映射代码在INSERT语句中填充它们. (当我查看SQL语句时,我可以看到这一点.我无法发布SQL语句,因为我在某种程度上将对象缩写为在StackOverflow上没有任何敏感数据).

问题是,为什么SQLAlchemy仍然尝试为tlog_real_timehh,tlog_real_timemm,tlog_real_timess和tlog_fin_booking插入值,我该如何防止这种情况?

感谢您给我的任何指示.

埃里克

解决方法:

from sqlalchemy import *

from sqlalchemy.orm import *

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class A(Base):

__tablename__ = 'a'

id = Column(Integer, autoincrement=False, primary_key=True)

firstname = Column(String(50))

lastname = Column(String(50))

fullname = Column(String(100), FetchedValue())

e = create_engine("mssql+pyodbc://scott:tiger@ms_2005", echo=True)

Base.metadata.drop_all(e)

e.execute("""

CREATE TABLE a (

id INTEGER PRIMARY KEY,

firstname VARCHAR(50),

lastname VARCHAR(50)

)

""")

e.execute("ALTER TABLE a ADD fullname AS firstname + ' ' + lastname")

sess = Session(e)

sess.add_all([

A(id=1, firstname='ed', lastname='jones'),

A(id=2, firstname='wendy', lastname='smith'),

A(id=3, firstname='jack', lastname='bean')

])

sess.commit()

assert [

fname for fname, in

sess.query(A.fullname).order_by(A.id)

] == ['ed jones', 'wendy smith', 'jack bean']

e.execute("DROP TABLE a")

标签:python,orm,sqlalchemy

来源: https://codeday.me/bug/20190629/1327454.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值