2016-11-13 2 views
1

Ich möchte ein Array von Strings in einer Tabelle speichern, an die ich dann weitere Daten anhängen kann.Veränderbares Array von Strings in PostgreSQL

Meine Tabelle sieht wie folgt aus:

CREATE TABLE users (id SERIAL, username varchar(32), password char(40), name varchar(64), age integer, successful_logins varchar(32)[10], failed_logins varchar(32)[10], roles text[3]); 

Ich habe dies versucht, aber es tut nichts tun:

UPDATE users SET successful_logins = array_append(successful_logins, :timestamp) WHERE username = :username; 

Die :varname kommt von einem JDBI Treiber Ich verwende, aber ich bin vorbei in ein Faden. Warum funktioniert das nicht? Gibt es einen besseren Weg, um das gleiche Ergebnis zu erzielen?

EDIT:

Hier ist der Treiber verwende ich:

<dependency> 
    <groupId>postgresql</groupId> 
    <artifactId>postgresql</artifactId> 
    <version>9.1-901.jdbc4</version> 
</dependency> 

ich keine Fehlermeldung angezeigt, und es scheint mein DAO oder Treiber werden Releted. ist der DAO-Code:

import org.skife.jdbi.v2.sqlobject.Bind; 
import org.skife.jdbi.v2.sqlobject.SqlUpdate; 

@SqlUpdate("UPDATE users SET successful_logins=ARRAY_APPEND((SELECT successful_logins FROM users WHERE username=:username),:timestamp)WHERE username=:username") 
void addSuccessfulLogin(@Bind("timestamp") String timestamp, @Bind("username") String username); 

Als ich dies versuche in psql mit dem Vars mit Werten ersetzt es funktioniert. Ich frage mich, ob dies ein Casting-Problem ist? Muss ich meine Zeichenfolge in etwas umwandeln?

+0

Inwiefern funktioniert es nicht? Erhalten Sie einen Fehler? Wenn ja, zeig es uns * (Frage bearbeiten) *. Wenn kein Fehler vorliegt, gibt die Anweisung eine Aktualisierungsanzahl von 1 zurück? – Andreas

+0

@Andreas Ich habe meine Antwort mit einigen Informationen aktualisiert. Ich verwende ein DAO, um in die DB zu schreiben, ich habe den obigen Code eingefügt. Ich bekomme keinen Fehler in meinem Programm, möglicherweise ein Fehler in den PSQL-Protokollen? Weißt du wo sie sind? – maffo

+0

Nun, es sieht so aus, als ob Ihnen ein Leerzeichen zwischen ARRAY_APPEND() und WHERE fehlt ... –

Antwort

0

Als ich den Anruf zu addSuccessfulLogin mache ich tat:

addSuccessfulLogin(username, timestamp); 

statt von

So wurde versucht, einen Benutzernamen basierend auf einem Zeitstempel zu finden, der nicht existiert. Deshalb gab es keine Fehler. Stellen Sie sicher, dass Sie Ihre eigene API korrekt aufrufen!

0

Ich bin nicht vertraut mit Ihrer JDBI Bibliothek, aber ich versuchte, dies in der Postgres-Konsole und es funktionierte:

UPDATE mytable SET successful_logins = 
ARRAY_APPEND(
    (
    SELECT successful_logins FROM mytable WHERE id=1), 
    'Some additional value' 
    ) 
WHERE id=1 

Vielleicht ist das Problem ist, dass Sie den vorhandenen successful_logins Wert auswählen müssen, bevor Sie es weitergeben die array_append.

EDIT: Nun, es sieht aus wie Sie ein Leerzeichen zwischen ARRAY_APPEND sind vermisst() und WHERE ...

+0

Danke für den Kommentar! Das funktioniert, wenn ich 'psql' benutze, obwohl ich momentan ein DAO verwende. Ich habe meine Frage mit weiteren Informationen aktualisiert. – maffo

+0

Ein Leerzeichen hinzugefügt, hat nicht geholfen. Ich habe jetzt die Log-Datei, aber es zeigt nur die Fehler, die ich in meiner Konsole bekomme, so dass es nicht viel hilft. – maffo

+0

Hmm ... die einzigen anderen Dinge, die einem in den Sinn kommen, sind, dass Ihr 'Benutzername' vielleicht nicht existiert, also keine Zeilen die 'WHERE'-Bedingung erfüllen oder dass sie die 32 Zeichen Grenze in der Definition verletzen. Oder vielleicht hat Ihr Benutzername führende oder nachgestellte Whitespace entweder in der DB oder in dem Parameter, den Sie übergeben? Seltsam. –