首页 > 解决方案 > 建立一个浮点 Python 的数据库 - 类型错误:强制转换为 Unicode:需要字符串或缓冲区,找到浮点数

问题描述

我目前在尝试将浮点数插入我的 sql 查询时遇到问题,该值是从 api 中提取的,通常是一个非常准确的数字,我无法让 python 用所述浮点数插入我的数据库,我什至尝试将其舍入但它仍然抛出错误。这是错误和代码:

错误

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

标签: pythonsqlitefloating-point

解决方案


看起来您可能没有将汇率转换为字符串,然后再将其与 SQL 查询的其余部分连接起来。您对 dbc.database_Insert 中的其他值执行此操作,但不是针对汇率


推荐阅读