Hi,
1. the server_default=... argument just says what default to define for the column *on creation* --- it has no effect if the table already exists. To apply the default to an existing table, you need to execute something like:
ALTER TABLE mytbl ALTER COLUMN mycol ADD DEFAULT ARRAY[]::integer[];
2. the server-side default has no effect if you configure SQLAlchemy to always specify a value for the column (which is what the default=... argument does).
So you could either (a) alter the table and skip the default=... argument, or (b) change the default=... argument to literal SQL with an explicit cast, e.g. default=literal_column("'{}'::integer[]") (because array() doesn't get compiled with an explicit typecast, even if you give it an explicit type_ ... maybe it should, when the array is empty.)
Cheers,
Gulli