Dodawanie rekordów do bazy

Odpowiedz Nowy wątek
2019-11-04 23:43
0

Hej. Mam problem z dodaniem rekordów do bazy danych. Mianowicie w pliku głównym mam coś takiego:

dbname = config.get("dbname")
        for k, v in data.items():
            date.append(k)
            data_array = np.array([v, v["1. open"], v["2. high"], v["3. low"], v["4. close"]])
            print(data_array)
            if k in date:
                DB.add_records(DB, data_array, dbname)
                print(DB.add_records())

Odwołuję się do klasy DB i metody add_records() z innego pliku:

class DB:

    db_connection = None

    def create_connect(self, dbname):
        # Połączenie z bazą danych lub stworzenie nowej jeśli nie istnieje
        self.db_connection = sqlite3.connect(dbname)

    def add_records(self, data_array, dbname):
        # Połączenie z bazą danych lub stworzenie nowej jeśli nie istnieje
        if self.db_connection is None:
            self.create_connect(dbname)

        # Dostep do kolumn przez indeksy oraz nazwy
        self.db_connection.row_factory = sqlite3.Row
        sql_insert_query = """
                                IF NOT EXISTS dataprice in prices (INSERT INTO prices (dateprice, price_open, 
                                price_close, price_high, price_low)
                                VALUES (?, ?, ?, ?, ?))
                                """
        self.db_connection.execute(sql_insert_query, data_array)
        self.db_connection.commit()

I po wywołaniu funkcji create_connect() otrzymuję taki komunikat:

line 29, in add_records
self.create_connect(dbname)
TypeError: create_connect() missing 1 required positional argument: 'dbname'

Przekazuję przecież ten argument poprzez tą linię:

DB.add_records(DB, data_array, dbname)

Czy ktoś wie co może być nie tak?

Pozostało 580 znaków

2019-11-05 01:03
0

Wywołaj tak:

DB.add_records(data_array, dbname)

Usuń/zmień to:

print(DB.add_records())
edytowany 1x, ostatnio: Delor, 2019-11-05 01:06

Pozostało 580 znaków

2019-11-05 09:29
1

Self na liście argumentów metody to taka uroda Pythona i nie oznacza, że masz tam przekazywać jakiś parametr. Self umożliwia dostęp do instancji w ciele metody, ale nie trzeba jej przekazywać jawnie. Prawdę mówiąc self to tylko konwencja możesz to nazwać jakkolwiek:

class A:
    def __init__(self):
        self.dupa = 'dupa'

    def multi(dupa, m):
        dupa.dupa *= m

    def printer(kupa):
        print(kupa.dupa)

a = A()
a.multi(2)
a.printer()

Wiedza to potęga

Pozostało 580 znaków

2019-11-05 11:17
1

Self na liście argumentów metody to taka uroda Pythona i nie oznacza, że masz tam przekazywać jakiś parametr

o_O

Oczywiście że oznacza i oczywiście że przekazujesz i robisz to jawnie przez zapis obiekt.metoda(args). W twoim przypadku można zrobić:

a = A()
A.multi(a,2) # to samo co a.multi(2)
A.printer(a) # to samo co a.printer()

Zapis obiekt.metoda to taki syntactic sugar na zapis Klasa.metoda(obiekt,...) gdzie Klasa okresla w zasadzie namespace gdzie metody się znajdują.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2019-11-05 11:18

Pozostało 580 znaków

2019-11-05 12:42
0

Wywołując metodę na instancji np. a.printer() nie musisz podawać argumentu self i to miałem na myśli, że Python niejawnie woła A.printer(a). W przykładzie kodu z resztą to widać. Z kolei jak nie masz instancji lub jej nie potrzebujesz to możesz wołać metody statyczne, które nie mają/nie muszą mieć argumentu self.


Wiedza to potęga

Pozostało 580 znaków

2019-11-05 19:37
0
Delor napisał(a):

Wywołaj tak:

DB.add_records(data_array, dbname)

Usuń/zmień to:

print(DB.add_records())

Niestety bez zmian - ten sam błąd.
"TypeError: add_records() missing 1 required positional argument: 'dbname'"

Po usunięciu DB.add_records()? - Delor 2019-11-06 02:26

Pozostało 580 znaków

2019-11-06 07:54
0

Po pierwsze utwórz sobie instancję klasy DB

database = DB()
database.add_records(data_array, dbname)

Wiedza to potęga
edytowany 1x, ostatnio: Haskell, 2019-11-06 07:54

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0