Должно быть возможно записать хранимую процедуру, которая посмотрела бы на метаданные для рассматриваемой таблицы, и создала бы необходимый SQL для обновления одной строки от другого, не имея необходимость к hardcode его. (Получите набор всех столбцов, цикла по нему, и т.д.), Но это походит на очень большую работу.
Вы могли также сделать то же самое в коде приложения (PHP, Perl, C#, или безотносительно), если Вы не можете выполнить его с sprocs.
свойство работает, потому что QObject имеет метакласс, который заботится о них. Посмотрите на эту небольшую вариацию кода @quark ...:
from PyQt4.QtCore import QObject
def makec(base):
class X( base ):
def __init__(self):
self.__x = 10
def get_x(self):
print 'getting',
return self.__x
def set_x(self, x):
print 'setting', x
self.__x = x
x = property(get_x, set_x)
print 'made class of mcl', type(X), issubclass(type(X), type)
return X
class old: pass
for base in (QObject, old):
X = makec(base)
x = X()
print x.x # Should be 10
x.x = 30
print x.x # Should be 30
при запуске выдает:
made class of mcl <type 'PyQt4.QtCore.pyqtWrapperType'> True
getting 10
setting 30
getting 30
made class of mcl <type 'classobj'> False
getting 10
30
видите разницу? В классе, который действительно является унаследованным классом (старого типа), созданным во второй раз, метаклассом является classobj
(который НЕ ЯВЛЯЕТСЯ подклассом типа), а свойства работают неправильно (присвоение xx
обходит свойство, и после этого получение xx
также больше не видит свойство). Но в первом случае, в случае Qt, есть другой метакласс, и он ЯВЛЯЕТСЯ подклассом типа (так что было бы неправильно говорить, что класс «не в новом стиле»!), И поэтому все работает правильно.
По крайней мере, в PyQt4.5 классы Qt определенно ЯВЛЯЮТСЯ объектами нового стиля, как видно из порядка разрешения их методов:
from PyQt4 import QtGui
print QtGui.QWidget.__mro__
(<class 'PyQt4.QtGui.QWidget'>, <class 'PyQt4.QtCore.QObject'>, <type 'sip.wrapper'>, <class 'PyQt4.QtGui.QPaintDevice'>, <type 'sip.simplewrapper'>, <type 'object'>)
Свойства сортировки Python, по моему опыту, отлично работают с объектами PyQt4. Я не знаю, поддерживаются ли они в PyQt4 явно или есть какие-то скрытые ошибки, но я никогда не видел, чтобы они плохо себя вели. Вот пример использования PyQt 4.4 и Python 2.5:
from PyQt4.QtCore import QObject
class X( QObject ):
def __init__(self):
self.__x = 10
def get_x(self):
return self.__x
def set_x(self, x):
self.__x = x
x = property(get_x, set_x)
x = X()
print x.x # Should be 10
x.x = 30
print x.x # Should be 30
pyqtProperty
позволяет использовать систему свойств Qt , которая отличается от системы Python. Свойства Qt можно анализировать изнутри классов C ++ Qt (которые не являются исходными свойствами Python) и используются Qt для таких вещей, как редактор форм Qt Designer и Qt Creator IDE. Они позволяют во многом самоанализ состояния выполнения , которое есть у вас в Python и отсутствует в C ++. В целом Qt предоставляет некоторые функции динамических языков для C ++, и это не единственная область, где PyQt предоставляет более одного способа сделать то же самое (учитывайте также строки, словари, файловый ввод-вывод и так далее). С большинством из этих вариантов главный совет, который у меня есть, - просто выбрать одну или другую сторону и придерживаться ее, просто чтобы избежать возможности некоторой неприятной несовместимости. Я предпочитаю версию Python версии Qt, потому что Python более важен для моей работы, чем Qt. Если вы собирались рассмотреть возможность переноса чего-либо из PyQt обратно на C ++ Qt, то вы могли бы предпочесть версию функции Qt версии Python.