Python SQLAlchemy ORM:使用 class 的实例更新行
Python SQLAlchemy ORM: Update row with instance of class
我正在尝试基于 class.
的实例创建一个用于更新数据库中行的函数
基本上我想做这样的事情:
def update_table(self, result):
session = self.Session()
session.query(result.__class__).filter_by(id=result.id).update(result)
session.commit()
session.close_all()
user = db.Model.User(
id = 1,
name = "foo"
)
# Store user to db
db.save(user)
updated_user = db.Model.User(
id = 1,
user = "bar"
)
# Update the users name with id=1
update_table(updated_user)
问题是会话查询导致
TypeError: 'User' object is not iterable
但在我看来,这应该以名称="bar".
的更新用户结束
有没有办法使用 SQLAlchemy ORM 创建这样的函数?
您不需要额外的更新程序...
user = db.Model.User(
id = 1,
name = "foo"
)
# Store user to db
db.save(user)
new_user = session.query(User).filter(User.id==1).first()
new_user.name = "bar"
session.commit()
我最终得到了这个解决方案:
# Update single entry
def update_table_by_id(self, entry):
# Open connection to database
session = self.Session()
# Fetch entry from database
db_result = session.query(entry.__class__).filter_by(id=entry.id)
# Convert Models to dicts
entry_dict = entry.as_dict()
db_result_dict = db_result.first().as_dict()
# Update database result with passed in entry. Skip of None
for value in entry_dict:
if entry_dict[value] is not None:
db_result_dict[value] = entry_dict[value]
# Update db and close connections
db_result.update(db_result_dict)
session.commit()
session.close_all()
它允许我发送任意模型,并且它们的处理都是一样的。
欢迎提出建议和改进!
我正在尝试基于 class.
的实例创建一个用于更新数据库中行的函数基本上我想做这样的事情:
def update_table(self, result):
session = self.Session()
session.query(result.__class__).filter_by(id=result.id).update(result)
session.commit()
session.close_all()
user = db.Model.User(
id = 1,
name = "foo"
)
# Store user to db
db.save(user)
updated_user = db.Model.User(
id = 1,
user = "bar"
)
# Update the users name with id=1
update_table(updated_user)
问题是会话查询导致
TypeError: 'User' object is not iterable
但在我看来,这应该以名称="bar".
的更新用户结束有没有办法使用 SQLAlchemy ORM 创建这样的函数?
您不需要额外的更新程序...
user = db.Model.User(
id = 1,
name = "foo"
)
# Store user to db
db.save(user)
new_user = session.query(User).filter(User.id==1).first()
new_user.name = "bar"
session.commit()
我最终得到了这个解决方案:
# Update single entry
def update_table_by_id(self, entry):
# Open connection to database
session = self.Session()
# Fetch entry from database
db_result = session.query(entry.__class__).filter_by(id=entry.id)
# Convert Models to dicts
entry_dict = entry.as_dict()
db_result_dict = db_result.first().as_dict()
# Update database result with passed in entry. Skip of None
for value in entry_dict:
if entry_dict[value] is not None:
db_result_dict[value] = entry_dict[value]
# Update db and close connections
db_result.update(db_result_dict)
session.commit()
session.close_all()
它允许我发送任意模型,并且它们的处理都是一样的。
欢迎提出建议和改进!