staging.inyokaproject.org

MySql Tabelle mit Variable erstellen

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Thomas330

Anmeldungsdatum:
10. Mai 2019

Beiträge: Zähle...

Hallo zusammen,

weiß nicht genau, ob ich hier im richtigen Forum bin. Möchte gern in einem Shell-Script eine Tabelle in einer DB erstellen, der Namen aus einem festen Teil und aus einer Variablen besteht.

#! /bin/bash
DATUM=` date +%Y%m%d`
QUERY=$(printf '"create table datenlager.crdata_aktuell_' ; printf $DATUM ; printf ' like crdata01_n00_aktuell"')
echo $QUERY
mysql -e $QUERY --user=xxx --password=yyy

Aber die Tabelle wird nicht erstellt. Es kommt ein Hinweis (ellenlang) auf die "richtige" Syntax.

Das 'echo' habe ich nur reingemacht, um zu gucken, wie der String aussieht. Und da sieht er gut aus ☹

Wie kann ich das bewerkstelligen, dass die Tabelle innerhalb des Scripts erstellt wir?

Danke Thomas

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

echo $QUERY
"create table datenlager.crdata_aktuell_20190511 like crdata01_n00_aktuell"

Kann es sein, dass da eventuell die Anführungszeichen aussen herum zu viel sind? Kannst du den gesamten mysql-Befehl manuell erfolgreich absetzen?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Du musst die referenzierte Variable $QUERY quoten (damit deren Wert als ein einzelnes Argument interpretiert wird, das nach -e kommt), statt Anführungszeichen in den String einzubauen, den die Variable als Wert hat:

1
2
3
4
5
#!/bin/bash
DATUM=$(date +%Y%m%d)
QUERY=$(printf "create table datenlager.crdata_aktuell_%s like crdata01_n00_aktuell"  "$DATUM")
echo "$QUERY"
mysql -e "$QUERY" --user=xxx --password=yyy

Thomas330

(Themenstarter)

Anmeldungsdatum:
10. Mai 2019

Beiträge: Zähle...

Hallo zusammen,

vielen Dank für die Hilfe. ☺

So wie es seahawk1986 beschrieben hat, funktioniert es einwandfrei. Hoffe, dass ich mir das merken kann.

Viele Grüße Thomas

Thomas330

(Themenstarter)

Anmeldungsdatum:
10. Mai 2019

Beiträge: 4

Hallo seahawk1986, gestern hat alles so wunderbar funktioniert. Heute möchte ich das erweitert anwenden, aber es klappt nicht.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#! /bin/bash
# welcher Wochentag ist heute (1=Montag)
WT=$(date '+%w')
HEUTE=$(date '+%Y%m%d')

echo "$HEUTE"
echo "$WT"

ABZUG=$(printf "1")

# ist heute Montag, dann den Freitag (minus 3 Tage) auswerten
        if [ $WT == 1 ]  # Montag
        then ABZUG=$(printf "3")
        fi
# ATAG=Auswertungstag
ATAG=$(date -d  "$HEUTE - $ABZUG days" +%Y%m%d)
echo $ATAG


# die Tabelle vom Auswertungstag mit Daten  füllen - ins Feld 'canme4' (Achtung bewusster Schreibfehler, leider), weil das nicht weiter benutzt wird
QUERY=$(printf "update datenlager.crdata_aktuell_%s inner join datenlager.ber_aktuell on datenlager.crdata_aktuell_%s.pknr = datenlager.ber_aktuell.psn set datenlager.crdata_aktuell_%s.canme4 = datenlager.ber_aktuell.sa where datenlager.crdata_aktuell_%s.pknr=datenlager.ber_aktuell.psn" "$ATAG")
mysql -e "$QUERY" --user=xxx --password=yyy

Bekomme die Fehlermeldung von MySQL, dass es diese Felder 'pknr', 'canme4' etc. in der Tabelle nicht gibt.

ERROR 1054 (42S22) at line 1: Unknown column 'datenlager.crdata_aktuell_.canme4' in 'field list'

Offensichtlich wird die Variable $ATAG ignoriert. Warum?

Brauche bitte nochmal Hilfe.

Danke Thomas

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Thomas330 schrieb:

Offensichtlich wird die Variable $ATAG ignoriert. Warum?

Ignoriert wird sie nicht, aber von printf nur für das erste %s eingesetzt - wenn du sie mehrfach nutzen willst, musst du sie auch genauso oft als Argument übergeben.

Alternativ kannst du die Variable auch einfach dort von der Shell einsetzen lassen, wo sie benötigt wird:

1
QUERY="update datenlager.crdata_aktuell_${ATAG} inner join datenlager.ber_aktuell on datenlager.crdata_aktuell${ATAG}.pknr = datenlager.ber_aktuell.psn set datenlager.crdata_aktuell_${ATAG}.canme4 = datenlager.ber_aktuell.sa where datenlager.crdata_aktuell_${ATAG}.pknr=datenlager.ber_aktuell.psn"

Thomas330

(Themenstarter)

Anmeldungsdatum:
10. Mai 2019

Beiträge: 4

😊 Hallo seahawk1986, vielen Dank. Das sind so Sachen, die ich vielleicht 2x im Jahr brauche - und dann stehe ich auf dem Schlauch.

Die laufen dann über Jahre ohne weiteres Zutun (Greife nie ein laufendes System an).

Nochmals vielen Dank

Thomas

Antworten |