我已经测试了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)
答案 0 :(得分:0)
找到以下解决方案:1。执行session.query(stmt).all()
,2。根据1.的结果构建mydict
字典.3。使用{{1创建新的User1
实例4.使用new_user = User1(**mydict)
代替update
执行new_user
。没有更多的SAWarning消息。
谁拥有更优雅/更有效的解决方案?