2015-04-06 58 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

我檢查過上述解決方案,但問題與此無關。請告知 –

相關問題