借助Cygwin将Yelp SQL文件导入Windows本地PostgreSQL
我之前折腾过用Cygwin把Yelp的SQL导入本地PostgreSQL,踩了不少坑,给你梳理几个关键的排查点和解决步骤,应该能帮到你:
1. 先确保Cygwin的psql能正常连到本地库
别着急导入,先验证连接是否正常,这是基础:
- 执行命令:
psql -h localhost -U [你的PostgreSQL用户名] -d [目标数据库名]
比如默认用户是postgres,你新建的库叫yelp_db,那就是psql -h localhost -U postgres -d yelp_db - 如果连不上:
- 先去Windows服务里确认PostgreSQL服务是否启动(名字一般是
postgresql-x64-[版本号]) - 检查
pg_hba.conf文件(在PostgreSQL安装目录的data文件夹里),把localhost对应的认证方式改成md5或者trust(测试用trust更方便,之后记得改回来) - 确认防火墙没拦截5432端口,或者临时关闭防火墙测试
- 先去Windows服务里确认PostgreSQL服务是否启动(名字一般是
2. 先搞定表结构创建
你说先建空表再导数据,那先检查建表SQL的执行情况:
- 执行建表命令时,注意Cygwin的路径写法:Windows里的
D:\yelp\schema.sql要改成/cygdrive/d/yelp/schema.sql,完整命令:psql -h localhost -U postgres -d yelp_db -f /cygdrive/d/yelp/schema.sql - 常见建表报错的解决:
- 编码不匹配:Yelp的SQL基本都是UTF8编码,建库时一定要指定:
createdb -U postgres -E UTF8 yelp_db,如果已经建了库,删了重建最省心 - 关键字冲突:比如Yelp的
user表名是PostgreSQL的关键字,执行时加--quote-all-identifiers参数自动给标识符加双引号:psql -h localhost -U postgres -d yelp_db --quote-all-identifiers -f /cygdrive/d/yelp/schema.sql - 权限不够:给你的用户授权建表权限:
GRANT CREATE ON DATABASE yelp_db TO [你的用户名];
- 编码不匹配:Yelp的SQL基本都是UTF8编码,建库时一定要指定:
3. 数据导入的坑点解决
建完表后导数据,命令类似建表:psql -h localhost -U postgres -d yelp_db -f /cygdrive/d/yelp/data.sql,如果报错:
- 数据类型不匹配:比如字符串长度超了、日期格式不对。先检查表结构的字段类型,比如日期字段是不是
TIMESTAMP,如果数据里的日期格式不符合PostgreSQL要求,执行导入前先运行SET datestyle = 'ISO, MDY';来调整格式兼容 - 主键重复:Yelp的数据集偶尔会有重复主键,要么先删表的主键约束导入后再处理重复数据,要么执行时加
--set ON_ERROR_STOP=off跳过错误(但不推荐,最好先清理重复数据) - 大文件超时:Yelp的SQL文件很大,容易超时。去
postgresql.conf里调参数:把max_statement_time改成0(关闭超时),shared_buffers调大(比如1GB,根据你内存来),重启PostgreSQL服务。另外可以用nohup后台执行,还能存日志:nohup psql -h localhost -U postgres -d yelp_db -f /cygdrive/d/yelp/data.sql > import.log 2>&1 &
4. 嫌命令行麻烦?试试pgAdmin
其实Windows上的pgAdmin图形化工具更省心,不用折腾Cygwin:
- 打开pgAdmin连接本地库,创建好UTF8编码的数据库
- 右键数据库选「Restore...」,选中Yelp的SQL文件,点Restore就行,它会自动处理建表+导入,还能实时看进度和错误信息
内容的提问来源于stack exchange,提问作者Pil Kwon
相关产品推荐
相关产品推荐

