-1

我正在用 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 上运行。

如何解决此错误?

4

2 回答 2

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 上进行的。

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

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

此外,运行 MySQL 服务器的 OS 帐户必须具有 OS 权限才能将文件写入指定目录,并且要写入的文件必须不存在。此外,文件名必须符合 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 服务器的操作系统帐户写入,并且文件名符合文件系统的规则,并且文件名不存在,例如

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

于 2015-04-07T00:23:12.917 回答
0

这只是权限错误。

于 2015-05-22T18:54:40.973 回答