使用Dart将数据插入Postgres数据库

时间:2020-07-17 09:19:16

标签: postgresql dart crud

我有一个postgres数据库,其中包含一个名为“用户”的表。该表有四个字段:

  • id大型主键
  • display_name TEXT NOT NULL,
  • 通过电子邮件发送文本不为空
  • 电话号码文本

我想通过飞镖代码向其中添加数据。 我的尝试看起来像这样:

import "dart:io";
import "package:postgres/postgres.dart";
void main() async{
  var connection = PostgreSQLConnection(
        "localhost", 5432, "test",
        username: "something", password: "notTellingYou");
    try {
      await connection.open();
    } catch (e) {
      print(e);
    }

  Map<String, dynamic> data = {
    "display_name": "foo",
    "email": "foo@gmail.com"
  };
  await setData(connection, "users", data);
  
}

Future<void> setData(PostgreSQLConnection connection, String table, Map<String, dynamic> data) async {
  await connection.query("""
    INSERT INTO $table(${data.keys})
    VALUES ${data.values};
  """);
}

问题是我遇到了异常

(PostgreSQLSeverity.error 42601:“ display_name”处或附近的语法错误)

1 个答案:

答案 0 :(得分:1)

尝试使用变量替换:

import "dart:io";
import "package:postgres/postgres.dart";

Future<void> main() async {
  final connection = PostgreSQLConnection("localhost", 5432, "test",
      username: "something", password: "notTellingYou");
  await connection.open();

  final data = <String, dynamic>{
    "display_name": "foo",
    "email": "foo@gmail.com"
  };
  await setData(connection, "users", data);
  await connection.close();
}

Future<void> setData(PostgreSQLConnection connection, String table,
    Map<String, dynamic> data) async {
  await connection.execute(
      'INSERT INTO $table (${data.keys.join(', ')}) VALUES (${data.keys.map((k) => '@$k').join(', ')})',
      substitutionValues: data);
}

生成的文本将为"INSERT INTO users (display_name, email) VALUES (@display_name, @email)",每个变量(以@开头)将自动替换为地图中每个键的值。

这还将确保值中正确转义特殊字符。