That's the normal mechanics of how the ORM does inserts. For columns that have no default value, it supplies None explicitly. There's some obscure history behind that and I'm not sure there's much of a rationale beyond that it makes it easier to cache the INSERT statement and make use of executemany(). Its been that way for over 10 years so I'm not quick to just change those things unless it is really causing a problem.
If these columns have a server side behavior for INSERT then you'd also add server_default=FetchedValue() and then you wouldn't see the None on INSERT. On Feb 4, 2018 5:43 AM, "Lele Gaifax" <l...@metapensiero.it> wrote: Hi all, I have a PG database with tables like the following Column | Type | Modifiers ---------+-----------------------------+-------------------- ---------------------- id | uuid | not null default uuid_generate_v1() created | timestamp without time zone | not null default transaction_timestamp() changed | timestamp without time zone | name | character varying(192) | not null code | character varying(64) | not null value | integer | with a trigger that updates the "changed" field whenever a record is modified. Accordingly to the documentation[1] I thus modelled it like in the following way: import sqlalchemy as sa import sqlalchemy.orm as orm import sqlalchemy.types as types import sqlalchemy.dialects.postgresql as sapg md = sa.MetaData() testtable = sa.Table( 'testtable', md, sa.Column('id', sapg.UUID(True), primary_key=True, nullable=False, server_default=sa.func.uuid_generate_v1()), sa.Column('created', types.DateTime(), nullable=False, server_default=sa.func.transaction_timestamp()), sa.Column('changed', types.DateTime(), server_onupdate=sa.FetchedValue()), sa.Column('name', types.Unicode(192), nullable=False), sa.Column('code', types.Unicode(64), nullable=False), sa.Column('value', types.Integer, nullable=True)) class Base: def __init__(self, **kwargs): cls_ = type(self) for k in kwargs: setattr(self, k, kwargs[k]) class TestTable(Base): pass orm.mapper(TestTable, testtable) This works, but I notice that SA explicitly inserts the "changed" field with a None value on INSERTs, that is the following snippet: e = sa.create_engine('postgresql://localhost/test', echo=True) md.create_all(e) s = orm.Session(e) o1 = TestTable(name='foo', code='bar') s.add(o1) s.commit() produces a log like the following: 2018-02-04 11:34:12,464 INFO sqlalchemy.engine.base.Engine INSERT INTO testtable (changed, name, code, value) VALUES (%(changed)s, %(name)s, %(code)s, %(value)s) RETURNING testtable.id 2018-02-04 11:34:12,464 INFO sqlalchemy.engine.base.Engine {'changed': None, 'name': 'foo', 'code': 'bar', 'value': None} The doubt is: why is SA providing explicit None values for both "changed" and "value" fields? Am I missing something in the table description or what? Thanks in advance for any enlightenment! ciao, lele. [1] http://docs.sqlalchemy.org/en/latest/core/defaults.html# triggered-columns -- nickname: Lele Gaifax | Quando vivrò di quello che ho pensato ieri real: Emanuele Gaifas | comincerò ad aver paura di chi mi copia. l...@metapensiero.it | -- Fortunato Depero, 1929. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.