使用 Dart/Flutter Postgres 包来存储日期和空日期需要两个单独的命令

Using the Dart/Flutter Postgres Package to store dates and null dates needs two separate commands

我正在使用 Postgres 包 (On the pub.dev site) 在一个非常简单的数据库中更新记录。它有两个字段:一个名为 number 的文本字段主键和一个名为 date_of_birth.

的日期字段

如果 date_of_birth 是一个有效的 DateTime 字符串那么一切都很好(从下面的代码中可以看出)。但是如果 date_of_birth 是未知的(所以我设置为空)更新失败:

import 'package:postgres/postgres.dart';
void main() async {
  final conn = PostgreSQLConnection(
   'localhost',
    XXXXX,
    'XXXXX',
    username: 'XXXXX',
    password: 'XXXXX',
  );

  await conn.open();

  DateTime dob = DateTime.now();

  var results;
  results = await conn.query('''
    UPDATE account_details
    SET date_of_birth = '$dob'
    WHERE number = '123123'
  ''');

  await conn.close();
}

如果我设置:

dob = null;

程序失败并出现错误:

Unhandled exception:
PostgreSQLSeverity.error 22007: invalid input syntax for type date: "null"

所以我需要检查 dob 字段,程序现在看起来像这样:

  DateTime dob = DateTime.now();
  dob = null;

  var results;
  if (dob == null) {
    results = await conn.query('''
    UPDATE account_details
    SET date_of_birth = null
    WHERE number = '123123'
  ''');
  } else {
    results = await conn.query('''
    UPDATE account_details
    SET date_of_birth = '$dob'
    WHERE number = '123123'
  ''');
  }

这适用于我的简单数据库,但适用于我的真实应用程序。我在一个 table 中有多个日期字段。所以我必须检查这些日期值的每个可能组合 - 为每个写一个代码块!

谁能告诉我如何使用一条语句更新空日期和有效日期?

您自己引用了查询参数。永远不要这样做。除了您刚刚看到的那种问题之外,它还会使您面临微不足道的 SQL 注入攻击。

您使用的库有一些方法可以将占位符放入查询文本并在执行查询时传递变量。用那个。