将时间戳字段添加到 ogr2ogr 导入到 Postgis

Add timestamp fields to ogr2ogr import into Postgis

我设法创建了一个 model/schema 并使用 sequelize. Since I have a lot of points (>100K) I am longing back to the old way I used to import, using ogr2ogr (gdal) 将地理点插入到 Postgis 中,这要快得多(几乎是即时的,而不是 >20 分钟)。因为我想在初始导入后继续使用 sequelize,所以我仍然希望 sequelize 预先创建 model/schema,但随后使用 ogr2ogr 进行导入,然后使用 sequelize 继续 CRUD。

Here 我发现了这个片段“[….] 解决这个问题的一种方法是事先创建你的 table 结构并使用 OGR2OGR 加载数据。”这让我想到这也适用于 Postgres/Postgis。

Sequelize 为 createdAt 和 updatedAt 创建时间戳列,这是我喜欢的。但是当我使用 ogr2ogr 时,我得到“"createdAt" 列中的空值违反了非空约束”作为登录信息。

基于 this 稍微类似的问题,我尝试通过添加 -sql 选项来添加一个 createdAt 列:

ogr2ogr -f PostgreSQL PG:"host='0.0.0.0' user='root' port='5432' dbname='db' password='pw'" /home/user/geojsonImportfile.json -nln "DataPoints" -a_srs EPSG:4326 -sql "SELECT url, customfield, wkb_geometry, CURRENT_TIMESTAMP as createdAt FROM '/home/usr/geojsonImportfile.json'" -dialect 'PostgreSQL'

我在 运行 时得到的错误是:

ERROR 1: SQL Expression Parsing Error: syntax error, unexpected end of string, expecting '.'. Occurred around :
home/user/geojsonImportfile0.json'

除了我缺乏 SQL 知识外,我不确定这是否可行。

我该如何解决这个问题,即使用 ogr2ogr 进行导入但保留时间戳列?

当您使用 sequelize.define 创建 table 时,createdAtupdatedAt 列将自动创建为 timestamp with time zone NOT NULL

但您可以在续集定义脚本中规定非空约束:

const Mytable = sequelize.define('mytable', {
    id: {type: Sequelize.INTEGER, primaryKey: true},
    createdAt: {type: Sequelize.DATE, validate: {notNull:false}}
});

然后 table 被创建为:

CREATE TABLE mytables
(
  id integer NOT NULL,
  "createdAt" timestamp with time zone,
  "updatedAt" timestamp with time zone NOT NULL,
  CONSTRAINT mytables_pkey PRIMARY KEY (id)
)

http://docs.sequelizejs.com/manual/tutorial/models-definition.html#configuration

@JGH 根据您的建议,使用默认时间戳是有意义的。正如讨论的那样,我已经可以使用 sequelize 进行设置 here:

var user = sequelize.define('user', {
  createdAt: {
    type: DataTypes.DATE,
    field: 'beginTime',
    defaultValue: sequelize.literal('NOW()')
  }
}, {
  timestamps: true,

});