2017-11-09 2 views
0

Ich habe eine Datenbank, in der der Primärschlüssel 256 Byte Daten sein soll, die eine ID ist, die ich von einer anderen Anwendung bekomme.Verwenden eines Blob als Primärschlüssel in SQLAlchemy mit MySQL-Datenbank

Mein Problem ist SQLAlchemy gibt keinen length-Parameter für einen Primärschlüssel aus, auch wenn das Feld, das es betrifft, es bei der Verwendung create_all angegeben hat.

Modell

class Route(db.Model): 
    assignmentId = db.Column(db.Binary(256), primary_key=True, nullable=False) 

Dinge, die ich habe versucht

  • Providing mysql_length in den PrimaryKey Tabellenoptionen, aber das wird abgelehnt und somit nicht funktioniert. Fehler:

sqlalchemy.exc.ArgumentError: Argument 'mysql_length' is not accepted by dialect 'mysql' on behalf of <class 'sqlalchemy.sql.schema.PrimaryKeyConstraint'

  • Erstellen von Tabellen über manuell eine SQL-Anweisung ausgeben, die den erforderlichen Längenparameter enthält (Works, aber ich würde wirklich zu vermeiden, mag die ORM so ausweicht)

  • Andere Sachen, die nicht

ich weiß, zu nichts geführt haben mein pro blem ist ziemlich spezifisch, aber jede Hilfe zu einer Lösung wird wirklich geschätzt. Danke :)

Antwort

0

Ich habe keine Antwort mit sqlalchemy. Allerdings:

Sie werden ein Szenario haben, in dem eine externe Anwendung (außer Ihrer Python-App) die Daten aktualisiert. Wenn ja, dann würden Sie Constraints in der Datenbank angeben.

Wenn Ihre App die DB steuert, können Sie immer sicherstellen, dass Sie die Eingabe in der Anwendung validieren, bevor Sie sie in der DB speichern.

+0

ich die Gültigkeit auch in der Anwendung überprüfen, aber die Primärschlüsselbedingung ist als Sicherheitsnetz fungieren soll und wurde angegeben, damit ich wahrscheinlich damit rennen muss. – Andreas

0

Ich versuchte dies und es funktioniert:

class Test(db.Model): 
    __tablename__ = 'test' 
    assignmentId = db.Column(db.BINARY(64), primary_key=True, nullable=False) 
    name = db.Column(db.String(64)) 

und das Ergebnis:

MariaDB [ioc_eventdb]> describe test; 
+--------------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+--------------+-------------+------+-----+---------+-------+ 
| assignmentId | binary(64) | NO | PRI | NULL |  | 
| name   | varchar(64) | YES |  | NULL |  | 
+--------------+-------------+------+-----+---------+-------+ 
2 rows in set (0.00 sec) 
+0

Danke, dass du mir wieder geholfen hast! Leider funktioniert Ihr Ansatz nur für Spalten mit Längen unter 255 Zeichen, da BINARY nicht mehr erlaubt, während meine IDs 256 Zeichen lang sind und BLOB benötigen :( – Andreas

Verwandte Themen