Dodawanie rekordów do bazy

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?

0

Wywołaj tak:

DB.add_records(data_array, dbname)

Usuń/zmień to:

print(DB.add_records())
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()
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ą.

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.

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'"

0

Po pierwsze utwórz sobie instancję klasy DB

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

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