How do I import a file of SQL commands to PostgreSQL?

倖福魔咒の 提交于 2019-12-12 02:52:04

问题


I'm running this command from PostgreSQL 9.4 on Windows 8.1:

psql -d dbname -f filenameincurrentdirectory.sql

The sql file has, for example, these commands:

INSERT INTO general_lookups ("name", "old_id") VALUES ('Open',  1);
INSERT INTO general_lookups ("name", "old_id") VALUES ('Closed', 2);`

When I run the psql command, I get this error message:

psql:filenameincurrentdirectory.sql:1: ERROR:  syntax error at or near "ÿ_I0811a2h1"
LINE 1: ÿ_I0811a2h1 ru

How do I import a file of SQL commands using psql? I have no problems utilizing pgAdmin in executing these sql files.


回答1:


If your issue is BOM, Byte Order Marker, another option is sed. Also kind of nice because if BOM is not your issue it is non-destructive to you data. Download and install sed for windows:

http://gnuwin32.sourceforge.net/packages/sed.htm

The package called "Complete package, except sources" contains additional required libraries that the "Binaries" package doesn't.

Once sed is installed run this command to remove the BOM from your file:

sed -i '1 s/^\xef\xbb\xbf//' filenameincurrentdirectory.sql

Particularly useful if you file is too large for Notepad++




回答2:


Okay, the problem does have to do with BOM, byte order marker. The file was generated by Microsoft Access. I opened the file in Notepad and saved it as UTF-8 instead of Unicode since Windows saves UTF-16 by default. That got this error message: psql:filenameincurrentdirectory.sql:1: ERROR: syntax error at or near "INSERT" LINE 1: INSERT INTO general_lookups ("name", "old_id" ) VAL...

I then learned from another website that Postgres doesn't utilize the BOM and that Notepad doesn't allow users to save without a BOM. So I had to download Notepad++, set the encoding to UTF-8 without BOM, save the file, and then import it. Voila!

An alternative to using Notepad++ is this little python script I wrote. Simply pass in the file name to convert.

import sys

if len(sys.argv) == 2:
    with open(sys.argv[1], 'rb') as source_file:
        contents = source_file.read()

    with open(sys.argv[1], 'wb') as dest_file:
        dest_file.write(contents.decode('utf-16').encode('utf-8'))
else:
    print "Please pass in a single file name to convert."


来源:https://stackoverflow.com/questions/32126061/how-do-i-import-a-file-of-sql-commands-to-postgresql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!