SQLite3 Python сбивает с толку значения для столбцов? - PullRequest
0 голосов
/ 06 апреля 2020

Часть программы, которую я собираю, - это индексирование биржевых данных. Я работаю над функцией, которая берет словарь, играет с ним, а затем вставляет его значения в мою базу данных индексации (чьи столбцы соответствуют моим ключам), используя SQLite3.

def UpdateIndex(conn, ticker, coldict):
    # Do not change
    itable = "reference"

    #coldict format:
    #{
    #'ticker': 'some string'
    #'starttime': 'some datetime now a string',
    #'endtime': 'some datetime now a string',
    #'var1name': 'some string',
    #'var1method': 'some string',
    #'var2name': 'something here',
    #'var2method': 'something here'
    #... etc.
    #'varNname': 'varN'
    #'varNmethod': 'somestring'
    #}

    coldict['ticker'] = ticker
    exist = CheckIfRowExists(conn=conn, table=itable, ticker=ticker)

    if exist:
        UpdateRowTimes(conn=conn, tablename=itable, coldict=coldict)
    else:
        # Needs debugging
        cols = ', '.join(coldict.keys())
        values = ', '.join(['{}'.format(val) for val in coldict.values()])
        command = """INSERT INTO {} ({}) VALUES ({});""".format(itable, cols, values)
        #print(cols)
        #print(values)
        #print(command)
        c = conn.cursor()
        c.execute(command)
        conn.commit()

Я смотрю на него, и оно кажется хорошо. Я проверяю его, используя следующее:

conn = ConnectSQL("index.db")
coldict = {"starttime": 0, "endtime": 49}
UpdateIndex(conn=conn, ticker="IBM", coldict=coldict)

Когда я запускаю его с включенными функциями печати, мой вывод выглядит как

starttime, endtime, ticker
0, 49, IBM
INSERT INTO reference (starttime, endtime, ticker) VALUES (0, 49, IBM);
Traceback (most recent call last):
  File "/Users/dominictarro/Desktop/Code/Python/Sparro-Stock/scripts/pipe_inputs.py", line 189, in <module>
    UpdateIndex(conn=conn, ticker="IBM", coldict=coldict)
  File "/Users/dominictarro/Desktop/Code/Python/Sparro-Stock/scripts/pipe_inputs.py", line 102, in UpdateIndex
    c.execute(command)
sqlite3.OperationalError: no such column: IBM

У кого-нибудь есть ответ, почему это происходит? Предложения о том, как это исправить?

Кроме того, для всех, кто хочет убедиться, что моя база данных построена правильно.

indexdbname = "index.db"
if os.path.isfile(indexdbname) == False:
    itable = "reference"
    iconn = ConnectSQL(database=indexdbname)
    ic = iconn.cursor()

    statement = """CREATE TABLE {} (
    ticker text PRIMARY KEY,
    starttime text NOT NULL,
    endtime text NOT NULL
    )""".format(itable)
    ic.execute(statement)
    iconn.close()

    print("\'{}\'' made.".format(indexdbname))
else:
    print("\'{}\'' already exists.".format(indexdbname))

1 Ответ

0 голосов
/ 06 апреля 2020

Разобрался. Принял во внимание комментарий Клауса Д. о SQL инъекции и прочитал о заполнителях. Реорганизовал все мои функции запросов для использования заполнителей.

def UpdateIndex(conn, ticker, coldict):
    itable = "reference"
    '''

    coldict format:
    {
    'ticker': 'some string'
    'starttime': 'some datetime now a string',
    'endtime': 'some datetime now a string',
    'var1name': 'some string',
    'var1method': 'some string',
    'var2name': 'something here',
    'var2method': 'something here'
    ...
    'varNname': 'varN'
    'varNmethod': 'somestring'
    }

    '''
    coldict['ticker'] = ticker
    exist = CheckIfRowExists(conn=conn, table=itable, ticker=ticker)

    if exist:
        UpdateRowTimes(conn=conn, tablename=itable, ticker=ticker, coldict=coldict)
    else:
        # Needs debugging
        cols = ', '.join(coldict.keys())
        qmarks = ', '.join(['?' for i in range(len(coldict))])
        command = """INSERT INTO {} ({}) VALUES ({});""".format(itable, cols, qmarks)

        c = conn.cursor()
        c.execute(command, tuple(coldict.values()))
        conn.commit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...