La migration des alambics script :
def upgrade():
uuid_gen = saexp.text("UUID GENERATE V1MC()")
op.create_table(
'foo',
sa.Column('uuid', UUID, primary_key=True, server_default=uuid_gen),
sa.Column(
'inserted',
sa.DateTime(timezone=True),
server_default=sa.text("not null now()"))
sa.Column('data', sa.Text)
)
C'est ma classe de base pour SQL Alchemy :
Class Foo(Base):
__tablename__ = 'foo'
inserted = Column(TIMESTAMP)
uuid = Column(UUID, primary_key=True)
data = Column(TEXT)
Il dispose d'un mode d'insertion statique :
@staticmethod
def insert(session, jsondata):
foo = Foo()
foo.data = jsondata['data']
if 'inserted' in jsondata:
foo.inserted = jsondata['inserted']
if 'uuid' in jsondata:
foo.uuid = jsondata['uuid']
session.add(foo)
return foo
le but des 2 if est de simplifier les tests. de cette façon, je peux "injecter" un uuid et une date insérée, pour obtenir des données prédictibles pour mes tests.
Lorsque vous essayez d'insérer des données
foo = Foo()
foo.insert(session, {"data": "foo bar baz"})
session.commit()
Je reçois un IntegrityError :
[SQL: 'INSERT INTO foo (inserted, data) VALUES (%(inserted)s, %(data)s) RETURNING foo.uuid'] [parameters: {'data': 'foo bar baz', 'inserted': None}]
ce qui me semble normal car l'insertion viole la contrainte "not-null" dans la base de données postgres.
Comment empêcher sql alchemy d'insérer la valeur None dans le champ inséré ?
En jouant et en testant, j'ai découvert que si la colonne "insérée" est définie comme clé primaire, sql alchemy n'inclut pas le champ dans la déclaration d'insertion.
def upgrade():
uuid_gen = saexp.text("UUID GENERATE V1MC()")
op.create_table(
'foo',
sa.Column('uuid', UUID, primary_key=True, server_default=uuid_gen),
sa.Column(
'inserted',
primary_key=True,
sa.DateTime(timezone=True),
server_default=sa.text("not null now()"))
sa.Column('data', sa.Text)
)
Mais ce n'est pas ce que je veux.