2015-04-06 54 views
-2

我正在用Python设计一个应用程序,并试图写一个CSV文件,但我收到此错误:DatabaseError:1(HY000):无法创建/写入文件'2015-04-06 20:48:33.418000'.csv(Errcode:13 - Permission denied)

DatabaseError: 1 (HY000): Can't create/write to file '2015-04-06 20:48:33.418000'.csv (Errcode: 13 - Permission denied)

验证码:

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

请参阅上面的编辑代码。它是一个在csv中的简单的out-file生成器,但它给出了权限错误。 –

+0

我编辑了你的问题,在问题中包含错误,并删除了很多不必要的混乱。 – skrrgwasme

回答

-1

这只是权限错误。

+0

这不能解答问题。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你会能够[评论任何帖子](http://stackoverflow.com/help/privileges/comment)。 – Alex

+0

我正在访问远程数据库,它没有奏效。等待长时间的回应,但没有人回应。甚至标记了帖子,然后我在自己的系统上安装了Workbench并使其工作。现在它在MySQL工作台上正常工作,所以我发布了它的权限错误问题。这怎么不是答案? –

0

真的很简单。 Windows上的文件名中冒号字符不是有效的字符。这不被允许。

参考:https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx

冒号字符是在“保留字符”列表中,与其他几个人一起。 (备注:一个使用冒号的是对NTFS为备用数据流分隔价:http://blogs.technet.com/b/askcore/archive/2013/03/24/alternate-data-streams-in-ntfs.aspx


跟进

问题已显著编辑自从只要我以前的答案一些注意事项:

我不是很熟悉,在Windows操作系统上运行MySQL我的大部分与MySQL服务器的工作是在Linux上

的。语句将导致MySQL服务器尝试在服务器主机上写入文件。

MySQL用户(登录到MySQL的用户)必须具有FILE权限才能使用SELECT ... INTO OUTFILE语句。

此外,运行MySQL服务器的操作系统帐户必须具有将文件写入指定目录的操作系统权限,并且要写入的文件必须不存在。另外,文件名必须符合操作系统文件系统上文件名的命名规则。

编号: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服务器的帐户,并且文件名符合文件系统的规则,并且文件名不存在,例如

$ 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不允许分号作为文件名的一部分。

+0

我检查过上述解决方案,但问题与此无关。请告知 –

相关问题