我正在使用Python设计应用程序并尝试写入CSV文件,但我收到此错误:
DatabaseError:1(HY000):无法创建/写入文件' 2015-04-06 20:48:33.418000' .csv(错误代码:13 - 权限被拒绝)
守则:
def generate_report(self):
conn=mysql.connector.connect(user='root',password='',host='localhost',database='mydatabase')
exe2 = conn.cursor()
exe2.execute("""SELECT tbl_site.Site_name, State_Code, Country_Code,Street_Address, instrum_start_date, instrum_end_date, Comment INTO OUTFILE %s FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\n'FROM tbl_site JOIN tbl_site_monit_invent ON site_id = tbl_Site_site_id """, (str(datetime.datetime.now()),))
我可以在Mac上运行此代码而不会出现任何错误,但我需要它才能在Windows上运行。
如何解决此错误?
答案 0 :(得分:0)
非常简单。冒号字符不是Windows上文件名中的有效字符。这是不允许的。
参考:https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx
冒号字符位于“保留字符”列表中,还有其他几个字符。 (注意:冒号字符的一个用法是作为NTFS上备用数据流的分隔符.Ref:http://blogs.technet.com/b/askcore/archive/2013/03/24/alternate-data-streams-in-ntfs.aspx
<强>跟进强>
自从我之前的回答提供以来,该问题已被大量编辑。一些说明:
我不熟悉在Windows操作系统上运行MySQL。我在MySQL服务器上的大部分工作都在Linux上。
SELECT ... INTO OUTFILE
语句将导致MySQL服务器尝试在服务器主机上写入文件。
MySQL用户(登录MySQL的用户)必须具有FILE
权限才能使用SELECT ... INTO OUTFILE
语句。
此外,运行MySQL服务器的操作系统帐户必须具有将文件写入指定目录的操作系统权限,并且必须不存在要写入的文件。此外,文件名必须符合OS文件系统上文件名的命名规则。
参考:https://dev.mysql.com/doc/refman/5.5/en/select-into.html
为了调试此类问题,我强烈建议您回显将要发送到MySQL服务器的实际SQL文本。然后获取该SQL文本并从其他客户端运行它,如mysql命令行客户端。
要调试权限问题,您可以使用更简单的语句。测试将文件写入已知存在的目录,即已知mysql服务器具有写入文件的权限,并且文件名不存在且符合操作系统和文件系统的规则。
例如,在普通的Linux机器上,我们可以测试类似的东西:
mysql> SELECT 'bar' AS foo INTO OUTFILE '/tmp/mysql_foo.csv'
在我们运行之前,我们可以轻松验证/tmp
目录是否存在,是否可以由运行mysql服务器的OS帐户写入,并且文件名符合文件系统的规则,并且文件名不存在,例如
$ su - mysql
$ ls -l /tmp/mysql_foo.csv
$ echo "foo" >/tmp/mysql_foo.csv
$ cat /tmp/mysql_foo.csv
$ rm /tmp/mysql_foo.csv
$ ls -l /tmp/mysql_foo.csv
一旦我们克服了这个障碍,我们就可以继续测试将文件写入不同的目录,即文件名更复杂的文件。一旦我们完成了管道工作,我们就可以将实际数据转换为可用的csv格式。
原始问题似乎表明MySQL服务器在Windows操作系统上运行,似乎表明尝试编写的文件名包含分号字符。 Windows不允许使用分号作为文件名的一部分。
答案 1 :(得分:-1)
这只是权限错误。