PostgreSQL:在triggerfunction中的INSERT语句中用NULL排除值

时间:2018-06-11 11:14:00

标签: python postgresql triggers default sql-insert

我正在使用python脚本创建模式“schema1”的after_insert触发函数,以在名为“live”的模式中INSERT或UPDATE数据(取决于“live”中是否存在该对象)。我的问题是,我的代码我还使用NULL值INSERT或UPDATE值。例如:

INSERT INTO live.table1 (column1,coulmn2,column3) VALUES ('a',NULL,'b');

在其中一些列中,我在模式“实时”中有DEFAULT值,如果我从此触发器函数中为其分配NULL,则不会触发该值。如何动态地从INSERT / UPDATE语句中排除这些列?

我有以下代码:

# get all the columns and make set_values and insert_value strings
  set_values=''
  insert_values=''

  #if( execute ):

  command= '''
SELECT column_name FROM information_schema.columns WHERE table_name='{table}' and table_schema='{schema}';
  '''.format( table=table1, schema=schema1 )

  # do SQL
  cur.execute( command )
  columns=cur.fetchall()

  for i, column in enumerate(columns):
    if i:
      set_values+=", "

    if column[0]=='temp_info':
      set_values+=column[0]+"=NULL::text"
    else:
      set_values+=column[0]+"=NEW."+column[0]

  insert_values="( "
  for i, column in enumerate(columns):
    if i:
      insert_values+=", "
    insert_values+=column[0]

  insert_values+=" ) VALUES( "

  for i, column in enumerate(columns):
    if i:
      insert_values+=", "
    if( column[0]=='temp_info' ):
      insert_values+="NULL::text"
    else:
      insert_values+="NEW."+column[0]

  insert_values+=" )"

  ###############
  # make the triggerfunctions now
  ###############

  command= '''
CREATE OR REPLACE FUNCTION {schema}.{table}_after_insert() RETURNS trigger AS $BODY$
BEGIN
  IF( SELECT TRUE FROM {schema_live}.{table} WHERE {live_table_id} = NEW.{live_table_id} ) THEN
    UPDATE {schema_live}.{table} SET {set_values}
    WHERE NEW.{live_table_id} = {live_table_id};
    RAISE NOTICE 'Can update row in {schema_live}.{table}';

  ELSE
    INSERT INTO {schema_live}.{table} {insert_values};
    RAISE NOTICE 'Can insert row in {schema_live}.{table}';

  END IF;


  RETURN NEW;
END; $BODY$
LANGUAGE plpgsql;


    '''.format( schema_live=S_LIVE, schema=schema1, table=table1, live_table_id=ids[table1], table_id=id, set_values=set_values )

0 个答案:

没有答案