MySQL: Localhost funktioniert, ip nicht

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
fenestro
User
Beiträge: 13
Registriert: Sonntag 20. Oktober 2013, 00:33

Schönen guten Abend,
folgendes Problem.

Ich habe 2 100% identische Raspbian Systeme auf Raspberrys laufen.
ich möchte nun das System 1 auf die Datenbank von System 2 schreibt.
Habe das komplette Script bereits fertig, und jedes System kann auch auf seine eigene Datenbank schreiben, falls ich jedoch statt localhost die IP eines der anderen Systeme angebe bekomme ich folgenden Error in der Konsole und das Programm beendet:
Traceback (most recent call last):
File "hausfunk.py", line 44, in <module>
db = MySQLdb.connect("192.168.0.112","root","***","hausfunk" )
File "/usr/lib/python2.7/dist-packages/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 187, in __init__
super(Connection, self).__init__(*args, **kwargs2)
_mysql_exceptions.OperationalError: (2003, "Can't connect to MySQL server on '192.168.0.112' (111)")


Ich kann mir das Problem beim besten Willen nicht erklären, weswegen ich mir jetzt auch nicht sicher bin welchen Teil des Codes ich am besten hier poste, hier ist einfach mal der part beim absenden

Code: Alles auswählen

		if mes != 0:
			if empf == 2:
				# Open database connection
				db = MySQLdb.connect("192.168.0.104","root","***","hausfunk" )
			elif empf == 3:
				# Open database connection
				db = MySQLdb.connect("192.168.0.104","root","***","hausfunk" )				
								
			elif empf == 1:

				# Open database connection
				db = MySQLdb.connect("192.168.0.112","root","***","hausfunk" )	
			
			
			print "vor if"
			if mes == 1:    #hier ein oder alle
				sql = """INSERT INTO Nachrichtenein(Sender,
						 Nachricht)
						 VALUES ('Stefan', 'Nachricht')"""
				print "in if"
			elif mes == 2:
				sql = """INSERT INTO Nachrichtenein(Sender,
						 Nachricht)
						 VALUES ('Stefan', 'Nachricht')"""			
			elif mes == 3:
				sql = """INSERT INTO Nachrichtenein(Sender,
						 Nachricht)
						 VALUES ('Stefan', 'Nachricht')"""			
			elif mes == 4:
				sql = """INSERT INTO Nachrichtenein(Sender,
						 Nachricht)
						 VALUES ('Stefan', 'Nachricht')"""			
			elif mes == 5:
				sql = """INSERT INTO Nachrichtenein(Sender,
						 Nachricht)
						 VALUES ('Stefan', 'Nachricht')"""			
			elif mes == 6:
				sql = """INSERT INTO Nachrichtenein(Sender,
						 Nachricht)
						 VALUES ('Stefan', 'Nachricht')"""

			print "nach if"
			try:
			   # Execute the SQL command
			   cursor.execute(sql)
			   # Commit your changes in the database
			   db.commit()
			except:
			   # Rollback in case there is any error
			   db.rollback()

			# disconnect from server
			db.close()
			mes = 0
			empf = 0
    
mfg
Fenestro
BlackJack

@fenestro: Du hast die MySQL-Server auch so konfiguriert das sie Verbindungen von aussen, also mindestens von der jeweiligen anderen IP annehmen? Grundsätzlich *und* für die jeweiligen DB-Benutzer?
fenestro
User
Beiträge: 13
Registriert: Sonntag 20. Oktober 2013, 00:33

Das erklärt so einiges...
Google gibt aber leider keine nützliche Antwort, hast du nen Tipp für mich wo ich diese Einstellung finde?

Danke :)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mal etwas grundsätzliches zu Deinem Code:

Code: Alles auswählen

if mes == 1:    #hier ein oder alle
                                sql = """INSERT INTO Nachrichtenein(Sender,
                                                 Nachricht)
                                                 VALUES ('Stefan', 'Nachricht')"""
Diese ganzen ``if``-Blöcke sind ausgesprochen hässlich und verstoßen extrem gegen DRY. Ich habe beim Drüberblicken gar keinen Unterschied gefunden; sollte das in der Realität anders sein, so solltest Du die Logik von den Daten trennen und diese in einer geeigneten Struktur zusammenfassen.

Das gilt analog auch für den oberen Teil mit seinen ganzen ``connects``.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
fenestro
User
Beiträge: 13
Registriert: Sonntag 20. Oktober 2013, 00:33

Vielen Dank für die Kritik,
da das aber vorerst mein erstes und einziges Python Programm ist habe ich den einfachsten Weg gewählt,
ich werde aber versuchen den Code im laufe der Zeit aufzuräumen. Wichtig ist vorerst nur dass es funktioniert :)

Vielen Dank für die Hilfe und einen schönen Abend noch :D

//e "nachricht" wird später selbstverständlich noch ersetzt, hatte gestern Abend nur keine Lust mehr mir den Umgang mit Strings in Python anzueignen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

fenestro hat geschrieben: da das aber vorerst mein erstes und einziges Python Programm ist habe ich den einfachsten Weg gewählt, ich werde aber versuchen den Code im laufe der Zeit aufzuräumen. Wichtig ist vorerst nur dass es funktioniert :)
Hui... also nie :mrgreen:

Naja, so könnte man es in etwas besser schreiben (ungetestet, reines Muster), auch wenn man das alles noch thematisch in Funktionen aufteilen sollte:

Code: Alles auswählen

hosts =(
    "192.168.0.112"
    "192.168.0.104",
    "192.168.0.104"
)

users = (
    'Stefan',
    'Hyperion',
    'usw.'
)

with MySQLdb.connect(hosts[empf-1], "root", "***", "hausfunk" ) as con:
    cursor = con.cursor()
    try:
        sql = """INSERT INTO Nachrichtenein(Sender, Nachricht) 
        VALUES (%s, %s)"""    
        # Execute the SQL command
        cursor.execute(sql, (users[mes-1], message))
        # Commit your changes in the database
        con.commit()
    except:
        # Rollback in case there is any error
        con.rollback()
Ich kenne natürlich Deine Motivation nicht, aber das von Dir gezeigte hat mit idiomatischen Python wenig zu tun ;-) Ohne die Grundlagen wirklich kapiert zu haben, werden eben auch schon thematisch einfache Dinge zu Monster-Scripten... ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@fenestro: Wenn man an einem Datenbankproblem scheitert, aber die Operationen mit den Grunddatentypen noch nicht drauf hat, stimmt irgendetwas mit der Reihenfolge nicht so ganz. :-)

Ausserdem könnte man statt im Netz zu suchen, auch mal ganz gezielt in die Dokumentation der Datenbanksoftware schauen wie das da mit dem Zugriff und der Rechteverwaltung funktioniert. Ist ja nicht so als könnte man MySQL-Konfigurationen nur durch raten oder suchen im Netz erkunden.
Antworten