Форум сайта python.su
0
j2aА на сколько это корректно смешивать эти два подхода? Просто мне кажется, что в крупных проектах это не должно поощряться.
Но ты можешь сделать что хочешь средствами SQL expression language.
j2aДа потому, что код написан так, что к моменту удаления объекта у меня его просто нет. Есть элемент управления заполненный данными и все. Код конечно можно переписать, просто хочу сначала с этим моментом разобраться.
P.S. А в чем сермяжная правда? Какой смысл делать “копию” объекта для удаления из БД? Почему не воспользоваться самим объектом?
Офлайн
1
demasА ты не смешивай. Допиши метод к маппер-классу, который бы делал нужное.j2aА на сколько это корректно смешивать эти два подхода? Просто мне кажется, что в крупных проектах это не должно поощряться.
Но ты можешь сделать что хочешь средствами SQL expression language.j2aДа потому, что код написан так, что к моменту удаления объекта у меня его просто нет. Есть элемент управления заполненный данными и все. Код конечно можно переписать, просто хочу сначала с этим моментом разобраться.
P.S. А в чем сермяжная правда? Какой смысл делать “копию” объекта для удаления из БД? Почему не воспользоваться самим объектом?
Офлайн
20
demas
Почему 2? Поле где “two” это вообще первичный ключ.
(*1*) print id
orig = session.query(Product).filter(Product.name==id).first()
(*2*) print orig.name
demasНо он не является у тебя (в таком состоянии, содя по коду) элементом базы и, как минимум, не подвязан к сесси. Вот после такого кода, он будет находится в базе и сесси и ты сможешь его удалить (код относится к SQLAlchemy 0.5, в ранних версиях небыло метода add, он заменил собой save):
Здесь просто считываются поля из интерфейса и порождается объект.
s = Session()
s.add(product)
s.flush() # и/или s.commit(), если используешь транзакции
s.delete(product)
s.flush() # и/или s.commit(), если используешь транзакции
s.close()
Отредактировано (Окт. 16, 2008 12:20:38)
Офлайн
0
def get_selected_product(self):
(model, iter) = self.treeview.get_selection().get_selected()
return Product(self.treestore.get_value(iter, 0),
self.treestore.get_value(iter, 1),
self.treestore.get_value(iter, 2),
self.treestore.get_value(iter, 3),
self.treestore.get_value(iter, 4))
def delete_product(self, widget):
print '=== delete ==='
session = Session()
del_obj = self.get_selected_product()
print del_obj.name
session.save(del_obj)
print 'a'
session.flush()
session.delete(del_obj)
print 'b'
session.commit()
session.flush()
=== delete ===Я не могу сделать save() так как у меня уже есть такая запись в БД.
two
a
2008-10-16 14:00:12,832 INFO sqlalchemy.engine.base.Engine.0x..cc INSERT INTO product (name, category, fat, protein, carbo) VALUES (?, ?, ?, ?, ?)
2008-10-16 14:00:12,833 INFO sqlalchemy.engine.base.Engine.0x..cc
2008-10-16 14:00:12,834 INFO sqlalchemy.engine.base.Engine.0x..cc ROLLBACK
….
File “/var/lib/python-support/python2.5/sqlalchemy/engine/base.py”, line 942, in _handle_dbapi_exception
raise exceptions.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect)
sqlalchemy.exceptions.IntegrityError: (IntegrityError) column name is not unique u'INSERT INTO product (name, category, fat, protein, carbo) VALUES (?, ?, ?, ?, ?)'
Офлайн
0
def delete_product(self, widget):
print '=== delete ==='
session = Session()
session.query(Product).filter_by(name = 'two').delete()
session.flush()
AttributeError: ‘Query’ object has no attribute ‘delete’
Офлайн
20
> AttributeError: ‘Query’ object has no attribute ‘delete’
Я гворил что он появлился недавно, проверь версию SQLAlchemy.
Думаю что именно этот метод, последний, и будет оптимальным в твоем случае. Такой delete не будет загружать объект (опять, насколько мне известно, если использовать расширения в мапере, возможно, он все же будет загружаться).
..bw
Офлайн
0
Поставил 1.5 - последний способ заработал.
Спасибо за терпение :)
Офлайн
0
Кстати, еще маленький вопрос по теме - если кто-то объяснит - буду благодарен:
(model, iter) = self.treeview.get_selection().get_selected()
session = Session()
name = self.treestore.get_value(iter, 0)
session.query(Product).filter_by(name = name).delete()
session.flush()
session.commit()
2008-10-16 16:27:10,558 INFO sqlalchemy.engine.base.Engine.0x…6d2cВсе удалилось нормально.
2008-10-16 16:27:10,559 INFO sqlalchemy.engine.base.Engine.0x…6d2c DELETE FROM product WHERE product.name = ?
2008-10-16 16:27:10,562 INFO sqlalchemy.engine.base.Engine.0x…6d2c
2008-10-16 16:27:10,563 INFO sqlalchemy.engine.base.Engine.0x…6d2c COMMIT
(model, iter) = self.treeview.get_selection().get_selected()
session = Session()
#name = self.treestore.get_value(iter, 0)
product= Product(self.treestore.get_value(iter, 0),
self.treestore.get_value(iter, 1),
self.treestore.get_value(iter, 2),
self.treestore.get_value(iter, 3),
self.treestore.get_value(iter, 4))
name = product.name
session.query(Product).filter_by(name = name).delete()
session.flush()
session.commit()
2008-10-16 16:30:49,795 INFO sqlalchemy.engine.base.Engine.0x…3d2cОткуда то взялся INSERT. Откуда?
2008-10-16 16:30:49,796 INFO sqlalchemy.engine.base.Engine.0x…3d2c DELETE FROM product WHERE product.name = ?
2008-10-16 16:30:49,796 INFO sqlalchemy.engine.base.Engine.0x…3d2c
2008-10-16 16:30:49,799 INFO sqlalchemy.engine.base.Engine.0x…3d2c INSERT INTO product (name, category, fat, protein, carbo) VALUES (?, ?, ?, ?, ?)
2008-10-16 16:30:49,800 INFO sqlalchemy.engine.base.Engine.0x…3d2c
2008-10-16 16:30:49,801 INFO sqlalchemy.engine.base.Engine.0x…3d2c COMMIT
Офлайн
20
Ты можешь не делать flush перед commit, он выполнится автоматически.
Сложно сказать почему так получается, может ты не весь код показал? Если не добавляешь объект к сессии, то он не должен insert'иться.
..bw
Офлайн
72
demasЕсли я правильно разобрался в ситуации вам достаточно хранить ID объекта в своем дереве, этого будет достаточно для удаления из базы без всяких выкрутасов.
Да потому, что код написан так, что к моменту удаления объекта у меня его просто нет. Есть элемент управления заполненный данными и все. Код конечно можно переписать, просто хочу сначала с этим моментом разобраться.
Офлайн