【问题标题】:Add timestamp fields to ogr2ogr import into Postgis将时间戳字段添加到 ogr2ogr 导入 Postgis
【发布时间】:2017-12-18 15:05:56
【问题描述】:

我设法创建了一个模型/模式并使用sequelize 将地理点插入 Postgis。由于我有很多积分(> 100K),我渴望回到以前使用ogr2ogr(gdal)导入的旧方式,这种方式要快得多(几乎是即时而不是> 20分钟)。由于我想在初始导入后继续使用 sequelize,我仍然希望 sequelize 预先创建模型/模式,然后使用 ogr2ogr 导入,然后使用 sequelize 继续 CRUD。

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

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

基于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 进行导入但保留时间戳列?

【问题讨论】:

  • 您是否在表定义中为createdAt 设置了默认值?喜欢createdAt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP

标签: postgresql sequelize.js postgis gdal ogr2ogr


【解决方案1】:

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

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

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

然后创建表如下:

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

【讨论】:

  • 哈!我们的答案交叉了!正如你几秒钟前的那样,会批准你的!谢谢。
  • 哦,时间很接近了!谢谢你。
【解决方案2】:

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

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

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多