Kleines Problem mit SQL-Imports
Verfasst: Mittwoch 4. Mai 2022, 20:34
N'Abend zusammen,
ich habe letzte Woche privat ein kleines Projekt angefangen, um ein Forum inhaltlich für dessen Community - war vor ~10 Jahren irgend ne Foren-Eigenentwicklung, auf der es keinerlei Suchfunktionen oder ähnliches mehr gibt - auszulesen, relevante Informationen in eine eigene Datenbank zu schreiben (konform in eine phpBB-Installation), die Inhalte dann vom Forum indexieren zu lassen um letztlich eine Suchfunktion anzubieten, die von der restlichen Forensoftware abgetrennt wurde.
Insgesamt sind das mehrere Millionen Beiträge.
Soviel zum Plan.
Weil sich dazu Python, das habe ich schon in der Vergangenheit immer wieder mal irgendwo aufgeschnappt, so hervorragend eignet habe ich also zu Python gegriffen. Mit Python hatte ich aber noch nie zu tun, abgesehen von kleinen und nicht nennenswerten Script-Anpassungen auf dem Raspberry. Das Script ist knapp 270 Zeilen lang und soweit auch eigentlich(!) fertig.
Vor dem Start gebe ich noch den auszulesenden Foren-Bereich als URL an, setze die Variable für die posts und topics auf das jeweils derzeitige autoincrement der Datenbank, gebe die datenbankinterne foren-id ebenfalls einer Variable und lets go... das Script gräbt sich über alle Seiten hinweg durch die Thread-Seiten und nimmt alle jeweils darin enthaltenen Beiträge mit.
Knapp 800.000 Beiträge in etwa 45.000 Themen habe ich durch. Weil ich meinen Laptop aber ebenso wenig mehrere Wochen mit dem Script laufen lassen möchte wie meinen Rechner, habe ich das jetzt alles auf einen vServer geschmissen, auf dem das dann am Ende eh der Community bereit gestellt wird.
Das zur Sache insgesamt; jetzt zum Problem:
Für mich nicht nachvollziehbar wird das Script manchmal mit Errors beendet; im Script intern immer bei einem der SQL-Imports, beim Lauf aber "spontan".
Ist mir schon lokal aufgefallen... passierte immer wieder. Mal nach 30 Minuten, mal nach 15 Stunden, usw. Nicht super, weil ich dann den jeweiligen Lauf oft von vorne beginnen musste: Also Datenbank zurück spielen, Lauf neu starten. Ist also nicht so, dass das immer bei einem bestimmten Beitrag oder so, also an immer den gleichen Stellen des Auslesens passiert wäre.
Auf dem vServer jetzt tritt das Problem aber schon nach wenigen Threads auf. Mal nach 10, mal nach 15, dann nach 13. Länger als 30 Sekunden läuft es nicht. Der Fehler wird damit wirklich nervend...
Mal die Funktion für den Import der Beiträge:*das angegebene Datenbank-Passwort ist natürlich nicht zutreffend...
Und folgender Fehler:
Ich hoffe wirklich sehr, dass ihr mir helfen könnt. Ich kann nicht mehr...
ich habe letzte Woche privat ein kleines Projekt angefangen, um ein Forum inhaltlich für dessen Community - war vor ~10 Jahren irgend ne Foren-Eigenentwicklung, auf der es keinerlei Suchfunktionen oder ähnliches mehr gibt - auszulesen, relevante Informationen in eine eigene Datenbank zu schreiben (konform in eine phpBB-Installation), die Inhalte dann vom Forum indexieren zu lassen um letztlich eine Suchfunktion anzubieten, die von der restlichen Forensoftware abgetrennt wurde.
Insgesamt sind das mehrere Millionen Beiträge.
Soviel zum Plan.
Weil sich dazu Python, das habe ich schon in der Vergangenheit immer wieder mal irgendwo aufgeschnappt, so hervorragend eignet habe ich also zu Python gegriffen. Mit Python hatte ich aber noch nie zu tun, abgesehen von kleinen und nicht nennenswerten Script-Anpassungen auf dem Raspberry. Das Script ist knapp 270 Zeilen lang und soweit auch eigentlich(!) fertig.
Vor dem Start gebe ich noch den auszulesenden Foren-Bereich als URL an, setze die Variable für die posts und topics auf das jeweils derzeitige autoincrement der Datenbank, gebe die datenbankinterne foren-id ebenfalls einer Variable und lets go... das Script gräbt sich über alle Seiten hinweg durch die Thread-Seiten und nimmt alle jeweils darin enthaltenen Beiträge mit.
Knapp 800.000 Beiträge in etwa 45.000 Themen habe ich durch. Weil ich meinen Laptop aber ebenso wenig mehrere Wochen mit dem Script laufen lassen möchte wie meinen Rechner, habe ich das jetzt alles auf einen vServer geschmissen, auf dem das dann am Ende eh der Community bereit gestellt wird.
Das zur Sache insgesamt; jetzt zum Problem:
Für mich nicht nachvollziehbar wird das Script manchmal mit Errors beendet; im Script intern immer bei einem der SQL-Imports, beim Lauf aber "spontan".
Ist mir schon lokal aufgefallen... passierte immer wieder. Mal nach 30 Minuten, mal nach 15 Stunden, usw. Nicht super, weil ich dann den jeweiligen Lauf oft von vorne beginnen musste: Also Datenbank zurück spielen, Lauf neu starten. Ist also nicht so, dass das immer bei einem bestimmten Beitrag oder so, also an immer den gleichen Stellen des Auslesens passiert wäre.
Auf dem vServer jetzt tritt das Problem aber schon nach wenigen Threads auf. Mal nach 10, mal nach 15, dann nach 13. Länger als 30 Sekunden läuft es nicht. Der Fehler wird damit wirklich nervend...
Mal die Funktion für den Import der Beiträge:
Code: Alles auswählen
# Ausgelesene Beitragsinformationen als ganze Datensätze in die Datenbank importieren
def sql_import_post(topicid, forumid, timestamp, topictitle, text4sql, posturl, author4sql, url):
db = pymysql.connect(host='localhost', user='ckadmin', password='blablubb', db='cforum', port=3306, charset='utf8')
cursor = db.cursor()
sql1 = """
insert into phpbb_posts(
topic_id,
forum_id,
post_time,
post_username,
post_subject,
post_text,
post_url )value('%s','%s','%s','%s','%s','%s','%s')
""" % (
topicid, forumid, timestamp, author4sql, topictitle, text4sql, posturl)
# Auf Ausnahmefall prüfen...
try:
cursor.execute(sql1)
db.commit() #SQL-Kommando wird abgesetzt, die Datenbank beschrieben
except:
cursor.rollback()
print('Write failed')
cursor.close()
db.close()
Und folgender Fehler:
Code: Alles auswählen
Traceback (most recent call last):
File "/home/chef.py", line 188, in sql_import_post
cursor.execute(sql1)
File "/usr/local/lib/python3.9/dist-packages/pymysql/cursors.py", line 148, in execute
result = self._query(query)
File "/usr/local/lib/python3.9/dist-packages/pymysql/cursors.py", line 310, in _query
conn.query(q)
File "/usr/local/lib/python3.9/dist-packages/pymysql/connections.py", line 548, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/usr/local/lib/python3.9/dist-packages/pymysql/connections.py", line 775, in _read_query_result
result.read()
File "/usr/local/lib/python3.9/dist-packages/pymysql/connections.py", line 1156, in read
first_packet = self.connection._read_packet()
File "/usr/local/lib/python3.9/dist-packages/pymysql/connections.py", line 725, in _read_packet
packet.raise_for_error()
File "/usr/local/lib/python3.9/dist-packages/pymysql/protocol.py", line 221, in raise_for_error
err.raise_mysql_exception(self._data)
File "/usr/local/lib/python3.9/dist-packages/pymysql/err.py", line 143, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.DataError: (1366, "Incorrect string value: '\\xF0\\x9F\\xA4\\xAD\\xF0\\x9F...' for column `cforum`.`phpbb_posts`.`post_text` at row 1")
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/chef.py", line 276, in <module>
get_topic_content(url, lauf, topicid)
File "/home/chef.py", line 62, in get_topic_content
get_post_content(get_domain(url) + link, topictitle, topicid)
File "/home/chef.py", line 121, in get_post_content
sql_import_post(topicid, forumid, timestamp, topictitle, text4sql, posturl, author4sql, url)
File "/home/chef.py", line 191, in sql_import_post
cursor.rollback()
AttributeError: 'Cursor' object has no attribute 'rollback'