简体   繁体   中英

Specify FLOAT column precision in Peewee with MariaDB/MySQL

I am trying to specify the float precision for a column definition in Peewee and cannot find how to do this in theofficial docs or in the github issues .

My example model is below:

DB = peewee.MySQLDatabase(
  "example",
  host="localhost",
  port=3306,
  user="root",
  password="whatever"
)

class TestModel(peewee.Model):
    class Meta:
        database = DB

    value = peewee.FloatField()

The above creates the following table spec in the database:

SHOW COLUMNS FROM testmodel;
/*
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| value | float   | NO   |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+
*/

What I would like is to specify the M and D parameters that the FLOAT field accepts so that the column is created with the precision parameters I need. I can accomplish this in SQL after the table is created using the below:

ALTER TABLE testmodel MODIFY COLUMN value FLOAT(20, 6);  -- 20 and 6 are example parameters

Which gives this table spec:

SHOW COLUMNS FROM testmodel;
/*
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| value | float(20,6) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
*/

But I'd like it be done at table creation time within the peewee structure itself, rather than needing to run a separate "alter table" query after the peewee.Database.create_tables() method is run. If there is no way to do this in the peewee.FloatField itself then I'd also accept any other solution so long as it ensures the create_tables() call will create the columns with the specified precision.

As @booshong already mentions

The simpelst solution is to subclass the default FloatField like this:

class CustomFloatField(FloatField):
    def __init__(self, *args, **kwargs):
        self.max_digits = kwargs.pop("max_digits", 7)
        self.decimal_places = kwargs.pop("decimal_places", 4)
        super().__init__(*args, **kwargs)

    def get_modifiers(self):
        return [self.max_digits, self.decimal_places]

and then use it like this

my_float_field = CustomFloatField(max_digits=2, decimal_places=2)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM