База данных с плавающей точкой Python - TypeError: приведение к Unicode: нужна строка или буфер, найден float - PullRequest
0 голосов
/ 04 октября 2018

В настоящее время у меня возникают проблемы при попытке вставить float в мой sql-запрос, значение извлекается из API и обычно является очень точным числом, я не могу заставить python вставить в свою базу данных с указанным float, я даже пыталсяокругляя его вниз, но он по-прежнему выбрасывает ошибки.Вот ошибки и код:

Ошибка

Traceback (most recent call last):
  File "main.py", line 12, in <module>
    ic.main()
  File "/home/sage/Dev/market_Mon/interface_Controller.py", line 32, in main
    ccr.config_Load_Cur()
  File "/home/sage/Dev/market_Mon/config_Controller_Rebuild.py", line 41, in config_Load_Cur
    dbc.database_Insert(str(arr[0]), str(arr[0]), str(arr[1]), arr[2], time.time())
  File "/home/sage/Dev/market_Mon/database_Controller.py", line 14, in database_Insert
    query = "INSERT INTO " + '`'+ table + '`' + " VALUES('`id` INTEGER PRIMARY KEY','" + ticker + "', '" + currency + "', '" + exchange + "', '" + date + "')"
TypeError: coercing to Unicode: need string or buffer, float found

Код: Arr [2] - это значение, возвращающее число с плавающей запятой.Обратите внимание, что я удалил все свои попытки решить эту проблему, потому что они просто мешают понять, как именно она работает.

from decimal import Decimal, ROUND_HALF_UP
import ConfigParser
import io
import json_Controller as jsc
import database_Controller as dbc
import time
from colorama import init, Fore, Back, Style
import threading
import re
import json
from sys import stdout

#Function used to add new currency tickers into config.ini
def config_Add_Cur(currency):
    conf = open('config.ini', w)
    config = ConfigParser.ConfigParser()
    config.add('currency', currency, True)
    print (currency + 'added to config.ini')

#Function used to load all currency data from config.ini and to pull current
#Market data related to the relative tickers
def config_Load_Cur():
    api_Key = '967OAAEVKJ9WT8F1'
    arr = []
    whilel = 1
    var = 1

    with open('config.ini') as f:
        conf = f.read()
        config = ConfigParser.RawConfigParser(allow_no_value=True)
        config.readfp(io.BytesIO(conf))
        while whilel == 1:
            for (each_key, each_val) in config.items('currency'):
                try:
                    currency = each_key
                    data = jsc.json_Import_Cur(currency, api_Key)
                    arr.insert(0, data['Realtime Currency Exchange Rate']['3. To_Currency Code'])
                    arr.insert(1, data['Realtime Currency Exchange Rate']['4. To_Currency Name'])
                    arr.insert(2, data['Realtime Currency Exchange Rate']['5. Exchange Rate'])
                    arr.insert(3, data['Realtime Currency Exchange Rate']['6. Last Refreshed'])
                    dbc.database_Insert(str(arr[0]), str(arr[0]), str(arr[1]), arr[2], time.time())
                    print (Fore.GREEN + "-------------------------------------------------------------------------------------------")
                    print (Back.WHITE + Style.DIM + Fore.CYAN  + arr[0] + Style.NORMAL + Fore.YELLOW + arr[1]  + Fore.MAGENTA + Back.WHITE + arr[2] + Fore.RED + Back.WHITE + arr[3] + Fore.BLUE + Back.WHITE +" inserted into database" + Style.RESET_ALL)
                    if var == 4:
                        print(Fore.GREEN + "-------------------------------------------------------------------------------------------")
                        print (Back.WHITE + Fore.RED + "Sleeping 60 Seconds" + Style.RESET_ALL)
                        time.sleep(60)
                        var = 1
                    else:
                        var = var + 1

                except(KeyError):
                    pass

Контроллер базы данных:

import sqlite3
from colorama import init

#Initializes database connection and returns connection to function caller
def database_Connect():
    connection = sqlite3.connect('cur_Monitor.db')

    return connection

#Inserts new rows into a table, this is created to ensure uniformity between rows
def database_Insert(table, ticker, currency, exchange, date ):
    try:
        sql = database_Connect()
        query = "INSERT INTO " + '`'+ table + '`' + " VALUES('`id` INTEGER PRIMARY KEY','" + ticker + "', '" + currency + "', '" + exchange + "', '" + date + "')"
        sql.execute(query)
        sql.commit()
    except():
        pass
        print "Error occurred databasing!"

#Queries the table, and returns all values which either match or include the
#name string in their overall value
def database_Read(table, currency):
    sql = database_Connect()
    query = "SELECT * FROM " + table + " WHERE currency LIKE '" + currency + "%'"
    for row in sql.execute(query):
        return row

#Creates new tables into the database, this will always use the same format
#to ensure uniformity between tables
def database_Table(name):
    sql = database_Connect()
    query = "CREATE TABLE `" + name + "` (`id` INTEGER PRIMARY KEY,`ticker` text , `currency` text, `exchange` float, `date` timestamp)"
    sql.execute(query)
    sql.commit()
    print name + " New table created!"

#Allows the ordering of table read outs to help allow users to view data better
def database_Order(table, order):
    sql = database_Connect()
    query = "SELECT * FROM " + table + " ORDER BY " + order
    for row in sql.execute(query):
        print row

1 Ответ

0 голосов
/ 04 октября 2018

Похоже, что вы, возможно, не преобразовали свой обменный курс в строку перед тем, как объединить его с остальной частью вашего SQL-запроса.Вы делаете это для других значений в dbc.database_Insert, но не для обменного курса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...