Beim Versuch, Benutzerdaten von einer JSON-Datei in eine Datenbank mit der SQLAlchemy Ausdruckssprache zu importieren, erhalte ich die Fehlermeldung: NameError: name 'users' is not defined
„Nameerror: name‚<tableName>‘ist nicht definiert“ in SQLAlchemy wenn Importieren von Daten
Der Traceback ist wie folgt:
Traceback (most recent call last):
File "C:\Users\lmills\MyProject\Database-Configuration\CreateTable.py", line 43, in <module>
importData.userDataImport()
File "C:\Users\lmills\MyProject\Database-Configuration\importData.py", line 11, in userDataImport
conn.execute(users.insert(), userid = userData[i]['userid'], altuid = userData[i]['altuid'], lname = userData[i]['lname'], fname = userData[i]['fname'], phoneNum = userData[i]['phoneNum'], emailAddr = userData[i]['emailAddr'])
NameError: name 'users' is not defined
I Ausgabe der Tabellen Anweisungen in einem Python-Programm erstellen, CreateTable.py:
from sqlalchemy import create_engine, Table, Column, Integer, String,
MetaData, ForeignKey
import importData
import json
engine = create_engine('sqlite:///MyProject.db', echo=True)
metadata = MetaData(engine)
metadata.drop_all(engine)
users = Table('users', metadata,
Column('userid', Integer, primary_key=True),
Column('altuid', String(12)),
Column('lname', String(32)),
Column('fname', String(32)),
Column('phone_num', Integer, nullable=False),
Column('email_addr', String(32), nullable=False),
)
subscribables = Table('subscribables', metadata,
Column('subtag', Integer, primary_key=True),
Column('message_template', String(64)),
Column('descriptor_string', String(64)),
)
user_subs = Table('user_subs', metadata,
Column('userid', Integer, ForeignKey('users.userid')),
Column('subtag', Integer, ForeignKey('subscribables.subtag')),
)
user_prefs = Table('user_prefs', metadata,
Column('userid', Integer, ForeignKey('users.userid')),
Column('type_id', String(8), ForeignKey('notification_type.type_id')),
)
notification_type = Table('notification_type', metadata,
Column('type_id', String(8), primary_key=True),
Column('typename', String(8), nullable=False),
Column('Template', String(64)),
)
metadata.create_all()
importData.userDataImport()
Dann versuche ich, Daten zu importieren, ein Modul verwenden, userDataImport, innerhalb der importData.py-Datei, die die folgenden enthält:
import json
from sqlalchemy import create_engine
import sqlalchemy
def userDataImport():
engine = create_engine('sqlite:///MyProject.db', echo=True)
conn = engine.connect()
with open(r'C:\Users\lmills\MyProject\userData.json') as dataFile:
userData = json.load(dataFile)
for i in range(len(userData)):
conn.execute(users.insert(), userid = userData[i]['userid'], altuid = userData[i]['altuid'], lname = userData[i]['lname'], fname = userData[i]['fname'], phoneNum = userData[i]['phoneNum'], emailAddr = userData[i]['emailAddr'])
if __name__ == "__main__": userDataImport()
jedoch SQLAlchemy können Benutzer nicht identifizieren, die in der Tabelle ist, die ich in CreateTable.py geschaffen hatte, Wenn ich den Code aus dem Modul "userDataImport" unmittelbar nach metadata.create_all()
in CreateTable.py verschiebe, funktioniert alles einwandfrei und schön; Wenn ich dieses Modul anrufe, kann ich es nicht zum Laufen bringen. Ich habe versucht, die Engine an userDataImport zu übergeben und alternativ das Verbindungsobjekt an userDataImport zu übergeben, aber keiner dieser Versuche erwies sich als fruchtbar (in beiden Fällen wurde die Engine = ... und conn = ... entfernt). Wo gehe ich falsch?
Ich glaube nicht, das ist schon die Lösung. Zunächst einmal funktioniert es nicht. Zweitens ging es darum, die Importanweisungen von den Create Table-Anweisungen zu abstrahieren, die diese Lösung völlig außer Acht lässt. Ich würde erwarten, dass eine Datenbank in der Lage wäre, Daten in ihre Tabellen importieren zu können, ohne jedes Mal auf das create table-Skript verweisen zu müssen. Das scheint einfach nicht richtig zu sein. –