DatabaseError: 1 (HY000): Can't create/write to file '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)

我正在 Python 中设计应用程序并尝试写入 CSV 文件,但出现此错误:

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.

上工作

我该如何解决这个错误?

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

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

冒号字符与其他几个字符一起在 "reserved characters" 的列表中。 (注意:冒号字符的一种用途是用作 NTFS 上备用数据流的分隔符。参考:http://blogs.technet.com/b/askcore/archive/2013/03/24/alternate-data-streams-in-ntfs.aspx


跟进

自从我提供了上一个答案以来,该问题已经过大量编辑。一些注意事项:

我对 Windows OS 上的 运行ning MySQL 不是很熟悉。我在 MySQL 服务器上的大部分工作都在 Linux.

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

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

另外,运行宁MySQL服务器的OS账户必须有OS权限才能将文件写入指定目录,而要写入的文件written 必须不存在。此外,文件名必须符合 OS 文件系统上文件名的命名规则。

参考:https://dev.mysql.com/doc/refman/5.5/en/select-into.html

为了调试此类问题,我强烈建议您回显将要发送到 MySQL 服务器的实际 SQL 文本。然后从另一个客户端获取 SQL 文本和 运行 它,例如 mysql 命令行客户端。

对于调试权限问题,您可以使用更简单的语句。测试将文件写入已知存在的目录,即已知 mysql 服务器具有写入文件的权限,并且文件名不存在且符合 OS 的规则] 和文件系统。

例如,在一个普通的 Linux 盒子上,我们可以这样测试:

mysql> SELECT 'bar' AS foo INTO OUTFILE '/tmp/mysql_foo.csv'

在我们 运行 之前,我们可以很容易地验证 /tmp 目录存在,它可以被 运行 正在 OS 帐户写入 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 服务器正在 运行ning on Windows OS,并且似乎表明试图写入文件名包含分号字符。 Windows 不允许分号作为文件名的一部分。

这只是权限错误。