klen / peewee_migrate

Simple migration engine for Peewee
MIT License
353 stars 86 forks source link

Bug report: [Wrong migrate for datetimefield with default value] #208

Closed niturk closed 2 years ago

niturk commented 2 years ago

pw_migrate importing datetime as dt but use datetime keyword inside of migrations.

i have DateTimeField with default value in model

models/base.py

class BaseModel(Model):
    created = DateTimeField(default=datetime.datetime.now(tz=timezone.utc))
    updated = DateTimeField()

migrations/001_initial.py

import datetime as dt
import peewee as pw
from decimal import ROUND_HALF_EVEN

try:
    import playhouse.postgres_ext as pw_pext
except ImportError:
    pass

SQL = pw.SQL

def migrate(migrator, database, fake=False, **kwargs):
    """Write your migrations here."""

    @migrator.create_model
    class BaseModel(pw.Model):
        id = pw.AutoField()
        created = pw.DateTimeField(constraints=[SQL("DEFAULT datetime.datetime(2021, 11, 10, 17, 59, 56, 400314, tzinfo=datetime.timezone.utc)")], default=datetime.datetime(2021, 11, 10, 17, 59, 56, 400314, tzinfo=datetime.timezone.utc))
        updated = pw.DateTimeField()

        class Meta:
            table_name = "basemodel"
...

error

    migrate(migrator, self.database, fake=fake)
  File "<string>", line 40, in migrate
  File "<string>", line 42, in BaseModel
NameError: name 'datetime' is not defined
niturk commented 2 years ago

i fixed with; created = DateTimeField(default=lambda: datetime.now(timezone.utc))