Automatisch belegen Tabelle mit Dummy-Daten in MySQL

Ich habe eine MySQL-Tabelle, die ich mit einigen Dummy-Daten zum Testen (50+) bevölkern möchte.

Diese Tabelle hat einen Fremdschlüssel zu einer anderen Tabelle, so dass die Dummy-Daten die Referenz von dieser Tabelle überqueren müssen, aber wieder zufällig sind, dh nicht alle der gleiche Fremdschlüssel sein können.

Es hat auch ein Datum hinzugefügt Feld, das ich mit einem zufälligen Datum innerhalb einer Jahresspanne bevölkern möchte, z. B. irgendein Datum im Jahr 2010.

Meine Tischstruktur ist:

id, customer_id, date_added, title, total_cost 

Wo id der primäre Schlüssel ist, ist customer_id der Fremdschlüssel und date_added ist das Datumsfeld.

Was ist der beste Weg, dies zu tun? Ich würde es lieber direkt in MySQL machen, aber wenn nicht meine Website läuft auf Python so ein Weg, dies zu tun, dass würde tun.

  • Übergeben einer Python-Variablen auf R mit rpy2
  • MySQL-python-Verbindung sieht keine Änderungen an der Datenbank, die auf einer anderen Verbindung hergestellt wird, auch nachdem die Änderung begangen wurde
  • Kann keine Ergebnisse aus der gespeicherten Prozedur mit dem Python-Cursor zurückgeben
  • Rohen Dezimalwert aus der mysqldb-Abfrage erhalten
  • Verwenden Sie ein Python-Wörterbuch, um in mysql einzufügen
  • Python db-api: fetchone vs fetchmany vs fetchall
  • 5 Solutions collect form web for “Automatisch belegen Tabelle mit Dummy-Daten in MySQL”

    Wenn Sie wirklich wollen, um sich mit einigen Einrichten von Testdaten, sollten Sie die Fixture Route gehen. Dies wird dazu beitragen, stellen Sie sich eine ziemlich schöne Entwicklungsumgebung und kann sehr schön in Ihre Website-Framework integrieren, wenn Sie mit einem.

    Hier finden Sie einen Link zur Dokumentation des Fixture-Moduls

    Wenn du denkst, das ist ein bisschen zu viel Arbeit, um alles zu arbeiten, schau in das MySQLdb-Modul, das dir helfen wird, Daten in deine Tabelle einzufügen.

    Es kann in schlechtem Geschmack sein, um zurück zu einem Stackoverflow zu verknüpfen, aber jemand hat bereits die Datumsfrage beantwortet, die Sie fragen. Das findest du hier .

    Ich würde das nicht in MySQL ohne externe Hilfe aus einer Anwendung in Python geschrieben.

    Es gibt mehrere Anforderungen in Ihre Aussage eingebaut, die am besten in einem prozeduralen Stil ausgedrückt werden. SQL ist eine Set-basierte Sprache; Ich glaube nicht, dass es sich so gut an die Aufgabe stellt.

    Sie wollen, dass eine Anwendung Daten aus einer Quelle einnimmt, was auch immer eine Randomisierung und eine PII-Entfernung, die Sie benötigen, und dann die Testdaten nach Ihren Anforderungen konstruieren.

    Wenn es Datenbank nur für Test gedacht ist, können Sie eine in-Memory-Datenbank, die Sie bevölkern können, ändern Sie alle, die Sie mögen, und dann wegblasen für Ihren nächsten Test. Ich denke an etwas wie Hypersonic oder Derby oder TimesTen.

    Schnelle und schmutzige Lösung:

     drop table if exists orders; drop table if exists customers; create table customers ( cust_id int unsigned not null auto_increment primary key, name varchar(255) not null ) engine=innodb; create table orders ( order_id int unsigned not null auto_increment primary key, cust_id int unsigned not null, order_date datetime not null, foreign key (cust_id) references customers(cust_id) on delete cascade ) engine=innodb; drop procedure if exists load_test_data; delimiter # create procedure load_test_data() begin declare v_max_customers int unsigned default 0; declare v_max_orders int unsigned default 0 ; declare v_counter int unsigned default 0 ; declare v_rnd_cust_id int unsigned default 0; declare v_base_date datetime; set foreign_key_checks = 0; truncate table orders; truncate table customers; set foreign_key_checks = 1; set v_base_date = "2010-01-01 00:00:00"; set v_max_customers = 1000; set v_max_orders = 10000; start transaction; set v_counter = 0; while v_counter < v_max_customers do insert into customers (name) values (concat('Customer ', v_counter+1)); set v_counter=v_counter+1; end while; commit; start transaction; set v_counter = 0; while v_counter < v_max_orders do set v_rnd_cust_id = floor(1 + (rand() * v_max_customers)); insert into orders (cust_id, order_date) values (v_rnd_cust_id, v_base_date + interval v_counter hour); set v_counter=v_counter+1; end while; commit; end # delimiter ; call load_test_data(); select * from customers order by cust_id desc limit 10; select * from orders order by order_id desc limit 10; 

    Für die Prüfung von Geschäftsregeln, bevorzuge ich eigentlich sorgfältig durchdachte Daten über zufällige Daten. Entweder aus excel-> csv-> db oder manuell erstellten Insert-Anweisungen.

    Eine Zeile für jede Randbedingung, sagen:

    • Kunde ohne Auftrag
    • Ein Kunde mit Null Gesamtkosten
    • Ein Kunde mit fremden Charakteren im Namen (weil ich immer vergessen habe, damit umzugehen)
    • Ein Kunde mit max. Länge
    • Ein Kunde mit Scheiße Lasten von Aufträgen (um sicherzustellen, dass die GUI immer noch gut aussieht)

    Es macht es wirklich einfach, Regressionstests durchzuführen, weil man "weiß", wie die Daten aussehen sollen.

    Für Performance-Tests können Sie ziemlich gut mit zufälligen Daten tun, solange die Datenverteilung realistisch ist (was die Nützlichkeit von Indizes beeinflusst). Wenn Sie sehr fortgeschrittene Anforderungen haben, ist Ihre beste Wette, einige Software zu verwenden, die für diesen Zweck gebaut wird.

    Aber oft können Sie alle Daten, die Sie benötigen, aus einer einzigen Tabelle von ganzen Zahlen und cleveren Verwendung von integrierten Funktionen generieren:

    • rand() -> Zufallszahl generieren
    • mod() -> Wird verwendet, um wiederkehrende Sequenzen zu erzeugen (1,2,3,1,2,3)
    • lpad() and rpad() -> Für das Auffüllen von Strings auf bestimmte Längen

    Als solches ist diese Frage alt und beantwortet, aber ich nehme an, dass Sie noch wissen müssen, dass diese gespeicherte Prozedur, um Dummy-Daten auf MySQL zu laden, die von MySQL läuft und automatisch die Dummy-Daten nach Datentypen füllt.

    Alles, was Sie benötigen, um Datenbankname, Tabellenname und Anzahl der zu füllenden Datensätze anzugeben.

    call populate('sakila','film',1000,'N');

    (Vielleicht möchten Sie auch auf dem Git-Repo folgen.)

    Python ist die beste Programmiersprache der Welt.