首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么SQLITE使用Python 3不接受大于8的整数/文本数据?

为什么SQLITE使用Python 3不接受大于8的整数/文本数据?
EN

Stack Overflow用户
提问于 2019-08-14 19:13:40
回答 1查看 369关注 0票数 1

问题

我正在尝试将csv文件读取到Pandas,并将其写入SQLite database.Process工作,用于csv文件中的所有列,但“填充qty”是一个正整数(Int64)。进程将类型从文本/整数更改为BLOB。因此,我尝试只将"Fll qty“列从Pandas加载到SQLite,令人惊讶的是,我注意到我可以安全地对小于10的所有整数进行加载(我的数据集中没有9,基本上是1,2,成功加载了...,8 )。

以下是我尝试过的:

我尝试了我所能想到的:将模式中的"Fill_Qty“类型更改为整数、NULL或TEXT,在插入到SQLite表之前,将Pandas中的数据类型从int64更改为SQLite或string。他们都不起作用。从外观上看,"Trade_History.csv“文件在Pandas或Excel中似乎很好。有什么我的眼睛看不到的东西吗?!?所以我真的很困惑这里发生了什么!

您需要.csv文件来测试代码。下面是代码和.csv文件:code

守则:

代码语言:javascript
运行
复制
### Imports:
import pandas as pd
import numpy as np
import sqlite3
from sqlite3 import Error

def create_database(db_file):
    try:
        conn = sqlite3.connect(db_file)
    finally:
        conn.close()

def create_connection(db_file):
    """ create a database connection to the SQLite database
        specified by db_file
    :param db_file: database file
    :return: Connection object or None
    """
    try:
        conn = sqlite3.connect(db_file)
        return conn
    return None

def create_table(conn,table_name):  
    try:
        c = conn.cursor()
        c.execute('''CREATE TABLE {} (Fill_Qty TEXT);'''.format(table_name))
    except Error as e:
        print('Error Code:  ', e)
    finally:
        conn.commit()
        conn.close()
    return None

def add_trade(conn, table_name, trade):
    try:
        print(trade)
        sql = '''INSERT INTO {} (Fill_Qty)
              VALUES(?)'''.format(table_name)
        cur = conn.cursor()
        cur.execute(sql,trade)
    except Error as e:
        print('Error When trying to add this entry:  ',trade)
    return cur.lastrowid

def write_to_db(conn,table_name,df):
    for i in range(df.shape[0]):
        trade = (str(df.loc[i,'Fill qty']))
        add_trade(conn,table_name,trade)
        conn.commit()

def update_db(table_name='My_Trades', db_file='Trading_DB.sqlite', csv_file_path='Trade_History.csv'):
    df_executions = pd.read_csv(csv_file_path)
    create_database(db_file)
    conn = create_connection(db_file)
    table_name = 'My_Trades'
    create_table(conn, table_name)
    # writing to DB
    conn = create_connection(db_file)
    write_to_db(conn,table_name,df_executions)
    # Reading back from DB
    df_executions = pd.read_sql_query("select * from {};".format(table_name), conn)
    conn.close()
    return df_executions



### Main Body:

df_executions = update_db()

任何替代方案

我想知道是否有人有类似的经历?有什么建议/解决方案可以帮助我在SQLite中加载数据吗?我想要一些轻便的东西,除非没有其他的选择,否则我宁愿不使用Postgres或MySQL。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-14 19:25:41

插入数据时,不能将容器传递给.execute()。参考资料:https://www.python.org/dev/peps/pep-0249/#id15

相反,你需要做的是:

代码语言:javascript
运行
复制
trade = (df.loc[i,'Fill qty'],)
#                            ^ this comma makes `trade` into a tuple

您所遇到的错误类型可能是:

ValueError:参数是不受支持的类型

或者:

sqlite3.ProgrammingError:提供的绑定数不正确。当前语句使用1,并提供了2。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57500727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档