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 ROLLBACK
The "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 why
To 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
