Flask, не позволяйте SQLAlchemy добавлять значения, которые не указаны при создании экземпляров сопоставленных классов - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть этот класс:

class Payment(db.Model):
    __tablename__ = "payment"
    id = db.Column("payment_id", db.Integer, primary_key=True, autoincrement=True)
    date = db.Column("payment_date", db.DateTime)
    payment_collected = db.Column(db.Integer)
    amount_collected = db.Column(db.String(15))
    payment_type_id = db.Column("payment_type", db.Integer)
    reference_number = db.Column(db.String(255))
    is_invoice_data = db.Column(db.Integer)
    is_active = db.Column(db.Integer)
    payee_user_id = db.Column(db.Integer, db.ForeignKey("user.user_id"))
    services_rendered_id = db.Column(
        db.Integer, db.ForeignKey("services_rendered.service_id")
    )

, который отображается непосредственно в таблицу в моей базе данных.Для столбца payment_date (представленного свойством date класса) по умолчанию установлено значение CURRENT_TIMESTAMP.Однако при вызове этого класса в качестве конструктора, например:

new_payment = Payment(
    services_rendered_id=new_sr.id,
    payment_collected=True,
    payment_type_id=payment_type_id,
    payee_user_id=payee_id,
    amount_collected=amount_collected
)

, сгенерированный SQL вставляет значение во ВСЕ столбцы карты, включая payment_date, и передает None для тех столбцов, которые я не указал вКонструктор.

Пример:

INSERT INTO 
    payment 
        (payment_date, payment_collected, amount_collected, payment_type, reference_number, is_invoice_data, is_active, payee_user_id, services_rendered_id) 
    VALUES 
        (None, 1, '258.40', '7', None, None, None, 3240, 28)

Как можно избежать такого поведения, чтобы SQLAlchemy не переопределял значения по умолчанию, которые я установил в моей базе данных?

1 Ответ

0 голосов
/ 07 декабря 2018

Установка server_default=db.FetchedValue() для столбца date скажет SQLAlchemy получить значение по умолчанию для столбца из базы данных после INSERT. Для получения дополнительной информации см. Документацию.

...