PostgreSQL:从 SQL 复制到特定列
PostgreSQL: COPY FROM SQL to specific columns
上午的大部分时间我都在努力弄清楚如何格式化 COPY FROM
SQL 语句,我需要帮助。
我正在尝试将数据从 ASCII 文本文件导入到我的 Postgres 数据库中的 table。我认为它不喜欢我指定输入 ASCII 文件的方式。我已经尝试了两个文件路径,但没有成功:
file = os.path.normpath(os.path.join('c:\','Users','dan','Desktop','New_Folder','Sept_2014','R01761','R01761_tex.asc'))
file = r'C:\Users\dan\Desktop\New_folder\Sept_2014\R01761\R01761_tex.asc'
这是我用来访问数据库的脚本:
import psycopg2
try:
conn = psycopg2.connect("dbname='reach_4a' user='root' host='localhost' port='9000' password='myPassword'")
tblname = "sept_2014""
file = r"C:\Users\dan\Desktop\New_folder\Sept_2014\R01761\R01761_tex.asc"
#file = os.path.normpath(os.path.join('c:\','Users','dan','Desktop','New_Folder','Sept_2014','R01761','R01761_tex.asc'))
cur = conn.cursor()
sql = "COPY %s (easting,northing,texture) FROM %s DELIMITERS ' ';" % (tblname,file)
cur.execute(sql)
conn.commit()
except:
print "I am unable to connect to the database"
#Close Database
try:
conn.close()
print 'Database connection destroyed'
except:
print "I cant close the database"
当我在 python 控制台中单步执行我的脚本时,当我尝试 运行 cur.execute(sql)
行时出现以下错误:
---------------------------------------------------------------------------
ProgrammingError Traceback (most recent call last)
<ipython-input-34-c26e11f8fb81> in <module>()
----> 1 cur.execute(sql)
ProgrammingError: syntax error at or near "c"
LINE 1: COPY sept_2014 (easting,northing,texture) FROM c:\Users\dan\...
^
我是否正确地将我的字符串替换为我的 SQL 语句?
你应该把路径放在引号里:
"COPY %s (easting,northing,texture) FROM '%s' DELIMITERS ' ';"
我也会考虑使用文件路径参数化查询:
sql = "COPY {field} (easting,northing,texture) FROM %s DELIMITERS ' ';".format(field=tblname)
cur.execute(sql, (file, ))
请注意,在这种情况下,数据库驱动程序将负责在字符串值周围加上引号。而且,作为奖励,您现在可以防止 SQL injection attacks.
请注意,我们必须通过字符串格式将字段插入到查询中。确保您知道 tblname
的来源,并且您要么信任来源,要么在查询中使用之前 validate/escape/sanitize 它。
上午的大部分时间我都在努力弄清楚如何格式化 COPY FROM
SQL 语句,我需要帮助。
我正在尝试将数据从 ASCII 文本文件导入到我的 Postgres 数据库中的 table。我认为它不喜欢我指定输入 ASCII 文件的方式。我已经尝试了两个文件路径,但没有成功:
file = os.path.normpath(os.path.join('c:\','Users','dan','Desktop','New_Folder','Sept_2014','R01761','R01761_tex.asc'))
file = r'C:\Users\dan\Desktop\New_folder\Sept_2014\R01761\R01761_tex.asc'
这是我用来访问数据库的脚本:
import psycopg2
try:
conn = psycopg2.connect("dbname='reach_4a' user='root' host='localhost' port='9000' password='myPassword'")
tblname = "sept_2014""
file = r"C:\Users\dan\Desktop\New_folder\Sept_2014\R01761\R01761_tex.asc"
#file = os.path.normpath(os.path.join('c:\','Users','dan','Desktop','New_Folder','Sept_2014','R01761','R01761_tex.asc'))
cur = conn.cursor()
sql = "COPY %s (easting,northing,texture) FROM %s DELIMITERS ' ';" % (tblname,file)
cur.execute(sql)
conn.commit()
except:
print "I am unable to connect to the database"
#Close Database
try:
conn.close()
print 'Database connection destroyed'
except:
print "I cant close the database"
当我在 python 控制台中单步执行我的脚本时,当我尝试 运行 cur.execute(sql)
行时出现以下错误:
---------------------------------------------------------------------------
ProgrammingError Traceback (most recent call last)
<ipython-input-34-c26e11f8fb81> in <module>()
----> 1 cur.execute(sql)
ProgrammingError: syntax error at or near "c"
LINE 1: COPY sept_2014 (easting,northing,texture) FROM c:\Users\dan\...
^
我是否正确地将我的字符串替换为我的 SQL 语句?
你应该把路径放在引号里:
"COPY %s (easting,northing,texture) FROM '%s' DELIMITERS ' ';"
我也会考虑使用文件路径参数化查询:
sql = "COPY {field} (easting,northing,texture) FROM %s DELIMITERS ' ';".format(field=tblname)
cur.execute(sql, (file, ))
请注意,在这种情况下,数据库驱动程序将负责在字符串值周围加上引号。而且,作为奖励,您现在可以防止 SQL injection attacks.
请注意,我们必须通过字符串格式将字段插入到查询中。确保您知道 tblname
的来源,并且您要么信任来源,要么在查询中使用之前 validate/escape/sanitize 它。