问题
我正在尝试将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
守则:
### 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。
发布于 2019-08-14 19:25:41
插入数据时,不能将容器传递给.execute()。参考资料:https://www.python.org/dev/peps/pep-0249/#id15
相反,你需要做的是:
trade = (df.loc[i,'Fill qty'],)
# ^ this comma makes `trade` into a tuple您所遇到的错误类型可能是:
ValueError:参数是不受支持的类型
或者:
sqlite3.ProgrammingError:提供的绑定数不正确。当前语句使用1,并提供了2。
https://stackoverflow.com/questions/57500727
复制相似问题