我设法创建了一个模型/模式,并使用sequelize将地理位置插入到Postgis中。由于我有很多积分(>100K),我渴望回到我过去使用的导入方式,使用ogr2ogr (gdal),它更快(几乎是瞬间而不是>20分钟)。因为我想在初始导入后继续使用sequelize,所以我仍然希望sequelize预先创建模型/模式,但然后使用ogr2ogr导入,然后使用sequelize继续CRUD。
Here我找到了这个片段“…。解决这个问题的一种方法是提前创建表结构,并使用OGR2OGR加载数据。“这给了我一个想法,这也可以在Postgres/Postgis上工作。
Sequelize为createdAt和updatedAt创建时间戳列,这是我喜欢的。但是当我使用ogr2ogr时,我会得到“null value in column”“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进行导入,但保留时间戳列?
发布于 2017-07-14 02:52:15
@JGH遵循您的建议,有一个默认的时间戳是有意义的。我已经可以使用sequelize进行设置了,正如here所讨论的那样
var user = sequelize.define('user', {
createdAt: {
type: DataTypes.DATE,
field: 'beginTime',
defaultValue: sequelize.literal('NOW()')
}
}, {
timestamps: true,
});发布于 2017-07-14 02:50:53
使用sequelize.define创建表时,createdAt和updatedAt列将自动创建为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
https://stackoverflow.com/questions/45087284
复制相似问题