【问题标题】: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)
【发布时间】:2015-04-06 22:46:47
【问题描述】:

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

我该如何解决这个错误?

【问题讨论】:

  • 信息真的太少了....
  • 请参阅上面的编辑代码。它是一个简单的 csv 输出文件生成器,但它给出了权限错误。
  • 我已经编辑了您的问题,将错误包含在问题中,并删除了很多不必要的混乱。

标签: mysql python-2.7 csv wamp mysql-connector-python


【解决方案1】:

真的很简单。在 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 不允许分号作为文件名的一部分。

【讨论】:

  • 我已经检查了上述解决方案,但问题与此无关。请指教
【解决方案2】:

这只是权限错误。

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。
  • 我正在访问一个远程数据库,但它没有工作。等待了很长时间的响应,但没有人响应。甚至标记了帖子,然后我在自己的系统上安装了 Workbench 并让它工作。现在它在 MySQL 工作台上工作正常,所以我发布了它的权限错误问题。怎么不是答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 2021-12-09
  • 2019-11-04
  • 1970-01-01
  • 2018-01-01
  • 2019-11-29
  • 2015-11-21
相关资源
最近更新 更多