Python PostgreSQL:从SQL复制到特定列

Python PostgreSQL:从SQL复制到特定列,python,postgresql,filepath,psycopg2,string-substitution,Python,Postgresql,Filepath,Psycopg2,String Substitution,上午的大部分时间里,我一直在试图弄清楚如何格式化从SQL语句复制的COPY,我需要帮助 我正在尝试将数据从ASCII文本文件导入到Postgres数据库中的表中。我认为这与我指定输入ASCII文件的方式不一样。我尝试了两种文件路径,但都没有成功: file = os.path.normpath(os.path.join('c:\\','Users','dan','Desktop','New_Folder','Sept_2014','R01761','R01761_tex.asc')) file

上午的大部分时间里,我一直在试图弄清楚如何格式化从SQL语句复制的
COPY,我需要帮助

我正在尝试将数据从ASCII文本文件导入到Postgres数据库中的表中。我认为这与我指定输入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\...
                                                       ^
---------------------------------------------------------------------------
编程错误回溯(最近一次调用上次)
在()
---->1当前执行(sql)
编程错误:“c”处或附近的语法错误
第1行:从c:\Users\dan\。。。
^
我是否正确地将字符串替换为SQL语句?

您应该将路径放在引号中:


我还将考虑使用文件路径参数化查询:

sql = "COPY {field} (easting,northing,texture) FROM %s DELIMITERS ' ';".format(field=tblname)
cur.execute(sql, (file, ))
注意,在这种情况下,数据库驱动程序将负责在字符串值周围加引号。而且,作为奖励,你现在正在阻止

注意,我们必须通过字符串格式将字段插入查询中。确保您知道
tblname
的来源,并且在查询中使用之前,您可以信任来源,或者验证/转义/清理来源。

您应该将路径放在引号中:


我还将考虑使用文件路径参数化查询:

sql = "COPY {field} (easting,northing,texture) FROM %s DELIMITERS ' ';".format(field=tblname)
cur.execute(sql, (file, ))
注意,在这种情况下,数据库驱动程序将负责在字符串值周围加引号。而且,作为奖励,你现在正在阻止


注意,我们必须通过字符串格式将字段插入查询中。确保您知道
tblname
的来源,并且在查询中使用之前信任源,或者验证/转义/清理它。

当我尝试使用文件路径方法实现查询参数化时,我遇到以下错误:
psycopg2.OperationalError:无法打开文件“C:\Users\dan\Desktop\New\u folder\Sept\u 2014\R01761\R01761\u tex.asc”用于阅读:没有这样的文件或目录
。但是
os.path.isfile(file)
返回true。@dubbdan好吧,如果你只是在占位符周围加上引号(答案中的第一个建议),你会得到同样的错误吗?谢谢。@Dubbdan好的,至少它与答案和后续问题无关。如果您用
os.path.exists(file)
检查它会怎么样?让我们来看看。当我尝试用file path方法实现查询的参数化时,我得到以下错误:
psycopg2.OperationalError:无法打开文件”C:\Users\dan\Desktop\New\u folder\Sept\u 2014\R01761\R01761\u tex.asc”用于阅读:没有这样的文件或目录
。但是
os.path.isfile(file)
返回true。@dubbdan好吧,如果你只是在占位符周围加上引号(答案中的第一个建议),你会得到同样的错误吗?谢谢。@Dubbdan好的,至少这与答案和后续问题无关。如果您用
os.path.exists(文件)
检查它会怎么样?让我们来看看。