INSERT statement. My code inserts a new Arbeitsmittel into the DB using:
Arbeitsmittel = wrapper.getMapper('arbeitsmittel') d = {'hidx' : hidx, 'zodb_path' : zodb_path, 'versionsnr' : 0, 'dateiname' : AM.dateiname.replace(AM.hidx, hidx), 'neudat' : datetime.datetime.now(), 'benutzer' : getSecurityManager().getUser().getUserName().lower(), 'status' : 4, 'idzielgruppe' : 0, } AM_new = Arbeitsmittel(**d) session.save(AM_new) The 'Arbeitsmittel' mapper is defined against a select(): ###################################################################### # Arbeitsmittel ###################################################################### FassungTable = Table('fassung', metadata, autoload=True) StatusTable = Table('status', metadata, autoload=True) SachgebietTable = Table('sachgebiet', metadata, autoload=True) ZielGruppenTable = Table('zielgruppen', metadata, autoload=True) ArbeitsmittelTable = Table('arbeitsmittel', metadata, autoload=True) s = select([ArbeitsmittelTable,func.to_char(ArbeitsmittelTable.c.gesperrt_bis, 'DD.MM.YYYY').label('gesperrt_bis_string'), func.to_char(ArbeitsmittelTable.c.stand, 'DD.MM.YYYY').label('stand_string'), func.to_char(ArbeitsmittelTable.c.aedat, 'DD.MM.YYYY').label('aedat_string'), func.to_char(ArbeitsmittelTable.c.neudat, 'DD.MM.YYYY').label('neudat_string'), func.to_char(ArbeitsmittelTable.c.rechner_stand, 'DD.MM.YYYY').label('rechnerstand_string'), func.to_char(ArbeitsmittelTable.c.stand, 'YYYY-MM-DD').label('stand_string_us'), func.to_char(ArbeitsmittelTable.c.aedat, 'YYYY-MM-DD').label('aedat_string_us'), func.to_char(ArbeitsmittelTable.c.neudat, 'YYYY-MM-DD').label('neudat_string_us'), func.to_char(ArbeitsmittelTable.c.chgdat, 'YYYY-MM-DD').label('chgdat_string_us'),
GattungTable.c.bezeichnung.label('gattung_bezeichnung'), GattungTable.c.gattung.label('gattung_gattung'), GattungTable.c.dtd.label('gattung_dtd'), GattungTable.c.typ.label('gattung_typ'), GattungTable.c.template_dateiname.label('gattung_template_dateiname'), GattungTable.c.template_bezeichnung.label('gattung_template_bezeichnung'), GattungTable.c.dtd_kuerzel, GattungTable.c.dtd_bezeichnung, GattungTable.c.dtd_version, GattungTable.c.dtd_identifier, ZielGruppenTable.c.id.label('zielgruppen_id'), ZielGruppenTable.c.bezeichnung.label('zielgruppen_bezeichnung'), FassungTable.c.bezeichnung.label('fassung_bezeichnung'), SachgebietTable.c.bezeichnung.label('sachgebiet_bezeichnung'), StatusTable.c.bezeichnung.label('status_bezeichnung'), ], and_(ArbeitsmittelTable.c.idgattung==GattungTable.c.id, ArbeitsmittelTable.c.idsachgebiet==SachgebietTable.c.id, ArbeitsmittelTable.c.status==StatusTable.c.status, ArbeitsmittelTable.c.idzielgruppe==ZielGruppenTable.c.id, )).alias('arbeitsmittel_select') class Arbeitsmittel(object): pass mapper(Arbeitsmittel, s)When generating the new instance above the following code SQL code is executed:
2007-07-02 12:02:07,836 INFO sqlalchemy.orm.unitofwork.UOWTransaction.0x..94 Task dump:
UOWTask(-0x511aef94, Arbeitsmittel/arbeitsmittel_select/None) (save/update phase)
|- Save [EMAIL PROTECTED] |---- 2007-07-02 12:02:07,837 INFO sqlalchemy.engine.base.Engine.0x..74 BEGIN2007-07-02 12:02:07,850 INFO sqlalchemy.engine.base.Engine.0x..74 select nextval('"arbeitsmittel_id_key"'::text)
2007-07-02 12:02:07,850 INFO sqlalchemy.engine.base.Engine.0x..74 None2007-07-02 12:02:07,854 INFO sqlalchemy.engine.base.Engine.0x..74 INSERT INTO arbeitsmittel (id, bezeichnung, version, stand, format, status, faxabruf, dateiname, originalname, idautor, idfassung, neudat, aedat, bemerkung, summary, chgdat, signatur, idsachgebiet, rechtefrei, honorarfrei, markierung, benutzer, stellvertreter, versionsnr, hidx, versionskommentar, zodb_path, idzielgruppe, rechner_version, formular_version, hidx_master, gesperrt_bis, rechnerstand, rechner_stand) VALUES (%(id)s, %(bezeichnung)s, %(version)s, %(stand)s, %(format)s, %(status)s, %(faxabruf)s, %(dateiname)s, %(originalname)s, %(idautor)s, %(idfassung)s, %(neudat)s, %(aedat)s, %(bemerkung)s, %(summary)s, %(chgdat)s, %(signatur)s, %(idsachgebiet)s, %(rechtefrei)s, %(honorarfrei)s, %(markierung)s, %(benutzer)s, %(stellvertreter)s, %(versionsnr)s, %(hidx)s, %(versionskommentar)s, %(zodb_path)s, %(idzielgruppe)s, %(rechner_version)s, %(formular_version)s, %(hidx_master)s, %(gesperrt_bis)s, %(rechnerstand)s, %(rechner_stand)s) 2007-07-02 12:02:07,855 INFO sqlalchemy.engine.base.Engine.0x..74 {'idsachgebiet': None, 'rechner_version': '', 'bemerkung': '', 'versionsnr': 0, 'idzielgruppe': 0, 'idfassung': 1, 'dateiname': 'HI1765738.pdf', 'originalname': '', 'rechnerstand': None, 'id': 96457L, 'hidx_master': None, 'rechner_stand': None, 'version': None, 'aedat': None, 'hidx': 'HI1765738', 'honorarfrei': True, 'neudat': datetime.datetime(2007, 7, 2, 12, 2, 7, 833609), 'rechtefrei': True, 'status': 4, 'signatur': None, 'faxabruf': None, 'format': 'PDF', 'stellvertreter': '', 'zodb_path': 'FO/738/HI1765738', 'markierung': None, 'chgdat': None, 'versionskommentar': None, 'idautor': 0, 'summary': 'ELSTER Teilnahmeerkl\xe4rung, die vor der ersten elektronischen Daten\xfcbermittlung mit Originalunterschrift abgegeben werden muss.', 'gesperrt_bis': None, 'stand': None, 'bezeichnung': None, 'formular_version': '', 'benutzer': 'sprollb'} 2007-07-02 12:02:07 INFO sqlalchemy.engine.base.Engine.0x..74 {'idsachgebiet': None, 'rechner_version': '', 'bemerkung': '', 'versionsnr': 0, 'idzielgruppe': 0, 'idfassung': 1, 'dateiname': 'HI1765738.pdf', 'originalname': '', 'rechnerstand': None, 'id': 96457L, 'hidx_master': None, 'rechner_stand': None, 'version': None, 'aedat': None, 'hidx': 'HI1765738', 'honorarfrei': True, 'neudat': datetime.datetime(2007, 7, 2, 12, 2, 7, 833609), 'rechtefrei': True, 'status': 4, 'signatur': None, 'faxabruf': None, 'format': 'PDF', 'stellvertreter': '', 'zodb_path': 'FO/738/HI1765738', 'markierung': None, 'chgdat': None, 'versionskommentar': None, 'idautor': 0, 'summary': 'ELSTER Teilnahmeerkl\xe4rung, die vor der ersten elektronischen Daten\xfcbermittlung mit Originalunterschrift abgegeben werden muss.', 'gesperrt_bis': None, 'stand': None, 'bezeichnung': None, 'formular_version': '', 'benutzer': 'sprollb'}
FROM arbeitsmittel WHERE arbeitsmittel.id = %(arbeitsmittel_id)s2007-07-02 12:02:07,867 INFO sqlalchemy.engine.base.Engine.0x..74 {'arbeitsmittel_id': 96457L} 2007-07-02 12:02:08,219 INFO sqlalchemy.engine.base.Engine.0x..74 INSERT INTO zielgruppen () VALUES ()
2007-07-02 12:02:08,219 INFO sqlalchemy.engine.base.Engine.0x..74 {} 2007-07-02 12:02:08,221 INFO sqlalchemy.engine.base.Engine.0x..74 ROLLBACKThe "INSERT INTO zielgruppen...." is wrong and not requested. The 'zielgruppen' table looks like this and is empty except one dummy row with id=0 and has no relationship to the 'arbeitsmittel' table. Although adding an explicit ForeignKeyConstraint for 'idzielgruppe' did not help.
Toolbox2Test=# \d zielgruppen Table "public.zielgruppen" Column | Type | Modifiers -------------+------------------------+-------------------------------------------------------------id | integer | not null default nextval('public.zielgruppen_id_seq'::text)
bezeichnung | character varying(256) | kuerzel | character varying(32) |So why the hell is SA trying to insert something into my 'zielgruppen' table?
Removing ZielGruppenTable.c.id.label('zielgruppen_id') from the select() makes the problem disappear however I don't know whyTo complete the description of my problem, here is the schema of the 'arbeitsmittel' table:
Toolbox2Test=# \d arbeitsmittel Tabelle ;public.arbeitsmittel+Spalte | Typ | Attribute
-------------------------------+--------------------------------+----------------------------------------------------------id | bigint | not null default nextval('"arbeitsmittel_id_key"'::text)
idgattung | integer | default 0 bezeichnung | character varying(255) | version | character varying(30) | stand | timestamp without time zone | format | character varying(10) | status | integer | default 0 umfang | integer | default 0 seiten | integer | default 0 faxabruf | character varying(50) | dateiname | character varying(255) | originalname | character varying(255) | idautor | integer | default 0 idfassung | integer | default 0 neudat | timestamp without time zone | aedat | timestamp without time zone | bemerkung | text | summary | text | chgdat | timestamp(0) without time zone | signatur | character varying(255) | idsachgebiet | integer | rechtefrei | boolean | honorarfrei | boolean | markierung | boolean |benutzer | character varying(32) | default ''::character varying
stellvertreter | character varying(32) | versionsnr | integer | default 0 num_rtf | integer | default 0 num_hre | integer | default 0 num_pdf | integer | default 0 hidx | character varying(16) | versionskommentar | character varying(1024) | versionsize | bigint | default 0 zodb_path | character varying(1024) | idzielgruppe | integer | default 0generator_tauglich | boolean | default false stammdatenverwaltung_tauglich | boolean | default false rechner_version | character varying(10) | default ''::character varying formular_version | character varying(10) | default ''::character varying
hidx_master | character varying(10) | gesperrt_bis | timestamp without time zone |sperrgrund | character varying(255) | default ''::character varying
rechnerstand | timestamp without time zone | rechner_stand | timestamp without time zone | Indexe: ;arbeitsmittel_pkey+ Primä²³chl|ssel, btree (id) ;arbeitsmittel_unique_hidx_vnr+ eindeutig, btree (hidx, versionsnr) ;arbeitsmittel_aedat_idx+ btree (aedat) ;arbeitsmittel_hidx_idx+ btree (hidx) ;arbeitsmittel_idautor_idx+ btree (idautor) ;arbeitsmittel_idfassung_idx+ btree (idfassung) ;arbeitsmittel_neudat_idx+ btree (neudat) ;arbeitsmittel_versionsnr_idx+ btree (versionsnr) ;hidx_master_hidx+ btree (hidx_master)
pgpMrMU8rTZHs.pgp
Description: PGP signature