1045, “Access denied” habe 2 Python Dateien, eine läuft, andere "Access denied"

gutschy

Aktiver Benutzer
Beiträge
32
Hallo Leute,

bin ein wenig ratlos, zwei Dateien, die selben Login Daten, aber eine klemmt ganz gewaltig. Ok, diese eine muss auf eine CSV Datei zugreifen, bricht aber mit einem Access Denied ab. Beide Dateien haben den gleichen mdb.connect String. Das Problem liegt vielleicht auch an meinem Linux und den Leseberchtigungen, sollte es aber nicht. Alle Dateien, inklusive der CSV Datei sind lesbar für alle.

Hier mal die Datei die Funktioniert.
Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb as mdb

con = mdb.connect('localhost', 'user', 'passw', 'pizzadb2', charset='utf8')

with con:
   
    cur = con.cursor()
    cur.execute("DROP TABLE IF EXISTS pizzeria_table3")
    cur.execute("CREATE TABLE pizzeria_table3(pizzeria_Id INT PRIMARY KEY AUTO_INCREMENT, \
                laden_name VARCHAR(50), vorwahl VARCHAR(15), telenr1 VARCHAR(20), \
                telenr2 VARCHAR(20), fax VARCHAR(20), strasse VARCHAR(40), hausnr VARCHAR(20), \
                plz VARCHAR(20), ort VARCHAR(40), oeffz1 VARCHAR(40), oeffz2 VARCHAR(40), \
                oeffz3 VARCHAR(40), oeffz4 VARCHAR(40), bestellwert1 VARCHAR(60), \
                bestellwert2 VARCHAR(60),bestellwert3 VARCHAR(60),rumpf_daten VARCHAR(60), \
                html_name VARCHAR(40), kartenname VARCHAR(30), linkname1 VARCHAR(40),\
                linkname2 VARCHAR(40), linkname3 VARCHAR(40), ordner VARCHAR(100), \
                spaltenanzahl INTEGER, logo_ordner VARCHAR(60), logo_name VARCHAR(60), \
                forum_link VARCHAR(100), link2 VARCHAR(40), link3 VARCHAR(40), banner VARCHAR(100), \
                UNIQUE(vorwahl, telenr1)) \
                default character set 'UTF8' COLLATE utf8_general_ci")

Hier das Teil das klemmt 'datenimport4.py':
Code:
#!/usr/bin/python
#-*- coding: utf-8 -*-

import MySQLdb as mdb

con = mdb.connect('localhost', 'user', 'passw', 'pizzadb2', charset='utf8')
                 

with con:

    cur = con.cursor()
    cur.execute("LOAD DATA INFILE 'Adressliste_forum1_v4.csv'\
            INTO TABLE pizzeria_table3 \
            FIELDS TERMINATED BY ',' \
            ENCLOSED BY '\"' \
            LINES TERMINATED BY '\\n'  \
            IGNORE 1 LINES \
            (laden_name, vorwahl, telenr1, strasse, hausnr, \
            ort, linkname1, linkname2, linkname3, forum_link, \
            link2, link3, banner) \
            ")

Hier mal die Fehlermeldung.
Code:
gutschy@kiste:~/pizza/pizza_daten$ python datenimport4.py
Traceback (most recent call last):
  File "datenimport4.py", line 21, in <module>
    ")
  File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1045, "Access denied for user 'pizzauser'@'localhost' (using password: YES)")

Wie gesagt, es könnte auch ein Linux Problem sein.
 
Werbung:
Hallo gutschy,

hast du den das Query "LOAD DATA INFILE....." direkt im client ausgeführt, ob da auch eine Fehlermeldung kommt. ZB. das die CSV nicht gefunden wird.

Gruss

Bernd
 
Hi Bernd,

lag an meinem Linux, im client läuft es. Hier die Lösung die ich von einem Linuxboard bekommen habe.

The problem is that the user you are using has not enough permissions. The CSV file is being read from the data directory of the MySQL server and you are executing the script with user 'gutschy', but the MySQL server is (probably) running using the system user 'mysql'.

However, you probably want to load the data a bit differently. You want to use the LOAD DATA LOCAL INFILE (note the 'LOCAL' keyboard). This means that the file will be uploaded to the MySQL server and then imported.

Here are the relevant changes to your code:
con = mdb.connect('localhost','user','passw','pizzadb2', charset='utf8'
local_infile=1)

..with con:..
cur.execute("LOAD DATA LOCAL INFILE 'Adressliste_forum1_v4.csv'\
..

For this to work, however, you need to change the MySQL server configuration. On Debian I like to do it adding an extra option file /etc/mysql/conf.d/server.cnf:
[mysqld]local-infile=1

Restart the MySQL server, and try your script using LOAD DATA LOCAL INFILE. Permissions should be OK.
 
Hallo,

versteh ich dich richtig ?

Im Client geht es und per Prog nicht ? Würde mich wundern, wenn du dich am Client mit den gleichen Anmeldedaten anmeldest wie es das Skript macht.

Oder hast du die Fileberechtigung schon geändert "chmod 755 datei", aber dann sollte es IMMER gehen egal welcher MySQL User du bist.

Gruss

Bernd
 
Hallo,

versteh ich dich richtig ?

Im Client geht es und per Prog nicht ? Würde mich wundern, wenn du dich am Client mit den gleichen Anmeldedaten anmeldest wie es das Skript macht.

*Seufz*.

Trenne bitte Client und Server. Und zwar physisch. Der Server steht in Amerika, der Client am Südpol. Wenn Du sagst, die Datei c:\ballerbude.csv soll gelesen werden, welche ist dann gemeint? Die in Amerika oder die bei den Pinguinen? Du sitzt zwischen den Pinguinen, auf Dein c:\ hast Du Zugriff, zum Server in Amerika konnektest Du Dich via DB-Protokoll. Du hast da keinen Zugriff auf das Filesystem.LOAD DATA [LOCAL], mit LOCAL ist der lokale Client gemeint. Und nun: Doku lesen.
 
*GENAU*

Und wenn Du in Amerika ins Prog schaust siehst du
"cur.execute("LOAD DATA INFIL'Adressliste_forum1_v4.csv'" und NIX von LOCAL und somit biste wieder am Südpol und wenns dann noch linux ist kommste mit "c:\" auch nicht weiter.

Somit funzt das dort wo da Prog rennt auch mit dem Client....

Bernd
 
Somit funzt das dort wo da Prog rennt auch mit dem Client....

Bernd

Das Programm läuft immer auf dem Client, ob das nun mysql.exe ist oder die MySQL-CLI unter Linux oder von PHP aus, es ist immer der Client. Mit LOCAL ist dann IMMER das lokale Filesystem gemeint, ohne LOCAL versucht es aber der Server auszuführen, also der Client sagt dann zum Server: öffne auf Deiner Pladde die Datei.
 
Werbung:
Genau das ist das was ich gesagt habe und in seinem Prog steht nicht LOCAL drin und somit versucht der Server die CSV auf dem Server zu öfnnen.
Wenn du dich am Client mit den gleichen Anmeldedaten anmeldest wie das Programm kannst du einfach feststellen ob du die Datei auf dem Server lesen kannst und damit feststellen ob eventuell die Rechte im Linux Filesystem falsch gesetzt sind oder die Datei nicht da ist bzw. am richtigen Ort liegt. Und mit "chmod 755 Dateiname" kann man die Rechte zumindest setzen das jeder User die Datei lesen kann.
 
Zurück
Oben