【问题标题】:PostgreSQL with SQLAlchemy won't allow empty entries带有 SQLAlchemy 的 PostgreSQL 不允许空条目
【发布时间】:2020-04-20 15:30:43
【问题描述】:

我花了很多时间试图弄清楚这一点,但似乎找不到任何东西。我想在我的数据库中允许空条目,因为并非所有字段都是必需的,并且 is 必要的内容将根据输入而改变。我认为可为空的条目可能是空的......

这是我得到的错误。请注意,这些值只是我输入的一些虚拟值,没有任何意义。在错误中的VALUES列表中,有一个小胡萝卜指向'133'之后的空''作为问题:

(psycopg2.errors.InvalidTextRepresentation) real 类型的无效输入语法:“” 第 1 行:...mit_date) VALUES ('3645', '654', 'Change', '133', '', '0', '...

这是我的代码:

Flask+SQLAlchemy:

class Request_Table(db.Model):
  __tablename__ = 'request_table'

  id = db.Column('id',db.Integer, primary_key=True)
  serial_num = db.Column('serial_num', db.String(10), nullable=False)
  meter_reading = db.Column('meter_reading', db.Float(5), nullable=False)
  request_type = db.Column('request_type', db.String(10), nullable=False)
  second_feet = db.Column('second_feet', db.Float(5), nullable=True)
  change_from = db.Column('change_from', db.Float(5), nullable=True)
  change_to = db.Column('change_to', db.Float(5), nullable=True)
  form_date = db.Column('form_date', db.String(10), nullable=False)
  laterals = db.Column('laterals', db.String(10), nullable=False)
  turnout = db.Column('turnout', db.String(10), nullable=True)
  remarks = db.Column('remarks', db.String(200), nullable=True)
  name = db.Column('name', db.String(20), nullable=True)
  submit_date = db.Column('submit_date', db.DateTime, default=datetime.utcnow)

  # Might not be needed but makes sense that it should be here.
  def __init__(self, id, serial_num : str = None, meter_reading : float = None, request_type : str = None, second_feet : float = None, change_from : float = None, change_to : float = None, form_date : str = None, laterals : str = None, turnout : str = None, remarks : str = None, name : str = None, submit_date : str = None):
    self.id = id
    self.serial_num = serial_num
    self.meter_reading = meter_reading
    self.request_type = request_type
    self.second_feet = second_feet
    self.change_from = change_from
    self.change_to = change_to
    self.form_date = form_date
    self.laterals = laterals
    self.turnout = turnout
    self.remarks = remarks
    self.name = name
    self.submit_date = submit_date

  # this is what gets returned when an entry is made
  def __repr__(self):
    return 'Success, I guess?'

这是 PGAdmin 所说的表格代码:

CREATE TABLE public.request_table
(
  id integer NOT NULL DEFAULT nextval('request_table_id_seq'::regclass),
  serial_num character varying(10) NOT NULL,
  meter_reading real NOT NULL,
  request_type character varying(10) NOT NULL,
  second_feet real,
  change_from real,
  change_to real,
  form_date character varying(10) NOT NULL,
  laterals character varying(10) NOT NULL,
  turnout character varying(10),
  remarks character varying(200),
  name character varying(20),
  submit_date timestamp without time zone,
  CONSTRAINT request_table_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);

似乎我指定为可为空的字段应该不允许输入,但是当我尝试时它失败了。我只在填写所有字段时工作。我究竟做错了什么?另外,如果有人看到我的任何非常愚蠢的格式(这是我第一次尝试数据库内容),请告诉我,我会修复它。

【问题讨论】:

  • 你得到什么样的错误?
  • @Dolfa,它只是在我的 Flask 路线中转到我的“添加此请求时出现问题”。我有一个 try-except 块,我尝试将它提交给数据库,如果它失败了,那么它只是说有一个问题。也许我可以找到一种方法让它打印错误消息...
  • 您成功填写了哪些字段?我担心'id',你在模型代码中将它指向哪里?根据文档,'id' 定义中应该有类似'Sequence('request_table_id_seq')' 的东西。 docs.sqlalchemy.org/en/13/dialects/postgresql.html
  • @Dolfa 所以我终于发现我得到的“错误”来自我输出错误的方式。真正的错误是: (psycopg2.errors.InvalidTextRepresentation) 类型为无效的输入语法 real: "" LINE 1: ...mit_date) VALUES ('3645', '654', 'Change', '133', '' , '0', '... 所以显然它不喜欢真实的空虚。但它需要允许它们(主要是因为我不想使用像 -1 这样的假值来表示“空”之类的) .
  • @Dolfa 另外,看起来你提到的 Sequence 东西是由 SQLAlchemy 或 PostgreSQL 自动放入的。上面的 SQL 代码在 id 字段后面有它。

标签: python sql postgresql flask flask-sqlalchemy


【解决方案1】:

问题实际上似乎是您试图将 String (Varchar) 类型的值插入到 Float (Real) 类型的字段中

试试这个:

INSERT INTO request_table
(serial_num, meter_reading, request_type, form_date, laterals, submit_date)
VALUES
("12345", 10.0, "POST", "2019-01-01", "Something", "2020-01-01");

或者这个:

Request_Table(
  id=123,
  serial_num='12345',
  meter_reading=10.0,
  request_type='Change',
  form_date='2019-01-01',
  laterals='something',
  submit_date='2020-01-01'
)

【讨论】:

    猜你喜欢
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多