我设法创建了一个模型/模式,并使用sequelize将地理点插入Postgis。由于我有很多积分(> 100K),我渴望回到过去使用ogr2ogr(gdal)导入的旧方法,这种方式要快得多(几乎是即时而不是> 20分钟)。因为我想在初始导入后继续使用sequelize,我仍然希望sequelize可以预先创建模型/模式,但是然后使用ogr2ogr导入,然后使用sequelize继续CRUD。
Here我发现这个片段“[...]解决这个问题的一种方法是先手工创建表结构,然后使用OGR2OGR加载数据。”这让我觉得这可行对于Postgres / Postgis也是如此。
Sequelize为createdAt和updatedAt创建时间戳列,我喜欢。但是当我使用ogr2ogr时,我会在列中获得“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知识外,我不确定这是否可行。
如何解决这个问题,即使用ogr2ogr进行导入,但保留时间戳列?
答案 0 :(得分:2)
当您使用sequelize.define
创建表格时,createdAt
和updatedAt
列会自动创建为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,
});