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

时间:2017-07-13 17:22:35

标签: postgresql sequelize.js postgis gdal ogr2ogr

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

Here我发现这个片段“[...]解决这个问题的一种方法是先手工创建表结构,然后使用OGR2OGR加载数据。”这让我觉得这可行对于Postgres / Postgis也是如此。

Sequelize为createdAt和updatedAt创建时间戳列,我喜欢。但是当我使用ogr2​​ogr时,我会在列中获得“null值”#34; createdAt"违反非空约束“as 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知识外,我不确定这是否可行。

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

2 个答案:

答案 0 :(得分:2)

当您使用sequelize.define创建表格时,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}}
});

然后创建表格如下:

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

答案 1 :(得分:1)

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

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

});