um euch den Wind aus den Segeln zu nehmen, eines gleich vorweg: Ich weiß, dass der try-except-Block ziemlich groß ausgefallen ist. In der Regel sollte man diesen Block sehr gering halten, damit man auch am Ende an die tatsächlichen Ausnahmen gelangt. In meinem Fall können mehrere und unterschiedliche Fehler auftauchen. Das ist mir bewusst. Daher möchte ich mich für meine unsaubere Art entschuldigen. Des Weiteren wundern sich einige von euch, warum ich in Zeile 14 bei einem Feld, welches als Primärschlüssel deklariert wird, auch noch unique auf True setze. Nun, da ich zur Zeit erst einmal mit MySQL arbeite, und mir beim Zugriff auf die Datenbank aufgefallen ist, dass das Feld mit dem Primärschlüssel nicht auf unique gesetzt wurde, habe ich es händisch noch zur Sicherheit hinzugefügt. Damit bin ich wohl nun der leidigen Diskussionen aus dem Weg gegangen :)
Das eigentliche Problem
Kommen wir zum eigentlichen Problem. Ihr seht in Zeile 15, dass nullable auf False gesetzt wurde. Was es mit NOT NULL und NULL auf sich hat, ist mir klar. In meinem Fall möchte ich einen Eintrag erzwingen. Der Benutzer soll also zu einem Eintrag gezwungen werden. Vor diesem Hintergrund habe ich gehofft, dass SQLAlchemy beim Versuch, einen leeren Datensatz anzulegen, eine Ausnahme wirft, und ich somit den Benutzer informieren kann, dass er einen Wert vergessen hat. Wenn ich also den nachfolgenden ausführbaren Quelltext ausführe, meine Anmelde-Daten korrekt eingebe, und dann an der Stelle, wo ich irgendeinen Text eingeben soll einfach nur Enter betätigt, wirft SQLAlchemy keine Ausnahme. Er tut so, als sei nichts geschehen und führt den commit() getrost aus (da ich echo auf True gesetzt habe, kann ich das verfolgen).
Meine Frage an euch. Habe ich was übersehen? Ist das ein normales Verhalten von seitens SQLAlchemy?
Warum ich euch das frage? Ich habe zum Test mit "MySQL Workbench" den gleichen versuch gestartet, indem ich versuche einen leeren Datensatz anzulegen, und dort bekomme ich folgende Meldung:
Und sowas in der Art habe ich bei SQLAlchemy auch gehofft. Aber nichts passiert. Keinerlei Fehlermeldung.ERROR 1364: Field 'some_text' doesn't have a default value
SQL Statement:
INSERT INTO `xarphus`.`some_text` (`id`) VALUES ('3')
Code: Alles auswählen
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Table, Column, Integer, String
''' setting up root class for declarative declaration '''
Base = declarative_base()
class SOME_TEXT(Base):
__tablename__ = "some_text"
id = Column(Integer, primary_key=True, unique=True)
some_text = Column(String(50), nullable=False, unique=True)
def __init__(self, Some_text):
self.some_text = Some_text
def main():
try:
dbms = raw_input('Enter database type: ')
dbdriver = raw_input('Enter database driver: ')
dbuser = raw_input('Enter user name: ')
dbuser_pwd = raw_input('Enter user password: ')
db_server_host = raw_input('Enter server host: ')
dbport = raw_input('Enter port: ')
db_name = raw_input('Enter database name: ')
url = '{}+{}://{}:{}@{}:{}/{}'.format(
dbms, dbdriver, dbuser, dbuser_pwd, db_server_host, dbport, db_name)
''' Create the engine '''
engine = create_engine(url, echo=True)
''' Create the schema and tables '''
Base.metadata.create_all(engine)
''' Create the Session class '''
Session = sessionmaker(bind=engine)
''' Create a new Session '''
session = Session()
''' Populate the database '''
enter_text = raw_input('Enter text: ')
some_text_table = SOME_TEXT(enter_text)
session.add(some_text_table)
''' Commit the changes: '''
session.commit()
except SQLAlchemyError as err:
print "err", err
if __name__ == "__main__":
main()