SAWarning:评估非映射列表达式

时间:2018-05-11 17:08:25

标签: python-3.x sqlalchemy

我已经测试了sqlalchemy几天,并且在ORM模式下使用更新方法时遇到了一些问题。

我基本上想要做的是从第二个表上执行的子查询的结果更新表。

这是一个简化的例子:

from sqlalchemy import create_engine, Column, Integer, Float, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session

Base = declarative_base()
engine = create_engine('postgresql+psycopg2://urldb', echo=True)
session = Session(engine)

class User1(Base):
    __tablename__ = 'user1'
    index = Column(Integer, primary_key=True)
    value1 = Column(Float)
    value2 = Column(Boolean)


class User2(Base):
    __tablename__ = 'user2'
    index = Column(Integer, primary_key=True)
    value1 = Column(Float)
    value2 = Column(Boolean)

try:
    User1.__table__.drop(engine)
    User2.__table__.drop(engine)
    Base.metadata.create_all(engine)
except:
    Base.metadata.create_all(engine)


user1 = User1(value1=12, value2=True)
user2 = User1(value1=15, value2=True)
user3 = User1(value1=7, value2=True)
user4 = User2(value1=12, value2=True)
user5 = User2(value1=15, value2=False)

session.add(user1)
session.add(user2)
session.add(user3)
session.add(user4)
session.add(user5)

session.flush()
session.commit()

stmt = session.query(User2).filter(User2.value1 > 12).subquery()

session.query(User1).filter(User1.value1 == stmt.c.value1).update({User1.value2 : stmt.c.value2})
session.commit()

我希望value2的{​​{1}}更新为user2,该代码可以正确执行。但是,我收到以下警告消息。据我所知,update会期望一些ORM之类的表达而不是stmt.c.但我没有看到如何将我的stmt对象转换为ORM对象(尝试别名为User1但失败了,我明白了为什么之后......)。

任何想法绕过警告信息?提前谢谢!

  

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/evaluator.py:71:SA警告:评估非映射列表达式'%( 4357770376 anon)s.value1'到ORM实例;这是一个弃用的用例。请使用ORM评估的UPDATE / DELETE表达式中的实际映射列。     "更新/删除表达式。" %子句)   /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sqlalchemy/orm/evaluator.py:71:SA警告:评估非映射列表达式'%(4357770376 anon) s.value2'到ORM实例;这是一个弃用的用例。请使用ORM评估的UPDATE / DELETE表达式中的实际映射列。     "更新/删除表达式。" %clause)

1 个答案:

答案 0 :(得分:0)

找到以下解决方案:1。执行session.query(stmt).all(),2。根据1.的结果构建mydict字典.3。使用{{1创建新的User1实例4.使用new_user = User1(**mydict)代替update执行new_user。没有更多的SAWarning消息。 谁拥有更优雅/更有效的解决方案?