Выполнить выставленный для обозрения триггер?

Вложенная функция имеет доступ к локальным именам в родительской функции. Когда вы определяете f за пределами , он не может получить доступ к локальным w1 и w2, поэтому он должен будет предположить, что это глобалы .

И если вы не определили w1 и w2 на глобальном уровне, ваша вторая версия фактически поднимает NameError:

>>> import sympy as sy
>>> def f(x):
...     return w1 * x**3 + w2 * x - 1
...
>>> def derivative(w1, w2, pt):
...     x = sy.Symbol('x')
...     def df(x):
...         return sy.diff(f(x),x)
...     return df(x).subs(x,pt)
...
>>> derivative(5, 8, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in derivative
  File "<stdin>", line 4, in df
  File "<stdin>", line 2, in f
NameError: name 'w1' is not defined

То, что вы не получили средства исключения Вы уже уже определили w1 и w2 ранее, и именно эти значения используются для предоставления вашего неверного ответа.

Вы можете «исправить» свой второй пример, установив вместо него w1 и w2 как глобальные. На самом деле не имеет значения, что вы передаете в качестве первого и второго аргументов в вызов derivative(), потому что эти значения аргументов w1 и w2 полностью игнорируются :

>>> w1 = 5
>>> w2 = 8
>>> derivative('This value is ignored', 'And so is this one', 2)
68

В вашей локальной установке вы , вероятно, устанавливаете w1 и w2 в 4 и 5 соответственно, потому что это те значения, для которых x равно 53:

>>> w1 = 4
>>> w2 = 5
>>> derivative('This value is ignored', 'And so is this one', 2)
53

Для вашего первого примера, w1 и w2 предоставлены местными жителями в derivative(); Неважно, какие глобальные имена вы определили, они не будут использоваться вместо этого.

Если вы хотите определить f за пределами derivative() и по-прежнему передавать сначала w1 и w2 в derivative(), то вам также необходимо передать те же значения в функцию f() :

def f(x, w1, w2):
    return w1 * x**3 + w2 * x - 1

def derivative(w1, w2, pt):
    x = sy.Symbol('x')

    # Get derivative of f(x, w1, w2)
    def df(x):
        return sy.diff(f(x, w1, w2), x)

    # Evaluate at point x
    return df(x).subs(x,pt)

Теперь f() явно получает w1 и w2 из вложенной функции df(), а не из глобальных.

7
задан mainstringargs 16 January 2009 в 17:03
поделиться

5 ответов

Да, триггеры не могут быть помещены в представления непосредственно. То, что необходимо сделать, поместить триггер в базовую таблицу и проверку, чтобы видеть, имеет ли новая строка ЧИСЛА значение, больше, чем 5.

Примечание: представление является только сохраненным избранным оператором, таким образом, это действительно не содержит данные. Именно поэтому нельзя проверить, чтобы видеть, вставляются ли данные, удаляются или обновляются в структуре представления.

7
ответ дан 6 December 2019 в 06:51
поделиться

Я думаю, что необходимо поместить триггер на таблицу, не представление.

Триггер мог использовать запрос на представлении так, чтобы Вы были DRY.

Действительно ли там какой-либо другой причиной являются триггерные потребности быть на представлении а не таблице?

Пример в ответ на комментарий

-- Create function
CREATE FUNCTION doWhatIwant() RETURNS trigger AS '
BEGIN
IF NEW.number > 5 THEN
  do_stuff
END IF;
RETURN NEW;
END;
' LANGUAGE plpgsql;

-- Create trigger
CREATE TRIGGER yourTrigger AFTER INSERT ON dummy_table
  FOR EACH ROW EXECUTE PROCEDURE doWhatIwant();
2
ответ дан 6 December 2019 в 06:51
поделиться

Можно использовать правила вместо триггеров (пример), но помнить, что правила являются PostgreSQL-определенной функцией.

2
ответ дан 6 December 2019 в 06:51
поделиться

Это возможно, если Вы добавляете триггер к таблице с тем же условием как представление.

Триггерное тело должно иметь что-то как:

if (inserted.NUMBER > 5) {
   do something;
}
//do nothing if inserted.NUMBER is not > 5
1
ответ дан 6 December 2019 в 06:51
поделиться

Я не уверен, чего Вы хотите достигнуть.

Триггер выполняет код на изменении данных. Представление является (скажем), "вызываемым подмножеством данных". Это фактически не существует, если Вы не выбираете из него. Это не может содержать триггер, потому что это ничего не содержит.

Так в основном Вы хотите триггер на базовой таблице.

0
ответ дан 6 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: