我想使用sqlalchemy将数据从熊猫DataFrame保存到sqlite数据库。 (我知道我可以使用pandas的.to_sql
,但是我发现如果某些操作无法正常使用,直接使用sqlalchemy会更容易。)
有些列包含numpy整数。当我尝试将它们另存为sql.Integer
时,它们实际上被另存为二进制文件。我认为给出此原因的答案为here,它还显示了使用sqlite3:sqlite3.register_adapter(np.int64, lambda val: int(val))
时该如何处理。
sqlalchemy是否有等效的东西?
这是一个例子
import pandas as pd
import sqlalchemy as sql
import numpy as np
eng = sql.create_engine('sqlite:///C:/test.db')
df = pd.DataFrame({'name':['a','b'],'integer': np.random.randint(5,size=2)})
with eng.connect() as con:
metadata = sql.MetaData()
users = sql.Table('users', metadata,
sql.Column('id', sql.Integer, primary_key=True),
sql.Column('name', sql.String),
sql.Column('integer', sql.Integer)
)
metadata.create_all(con)
data = [ df.iloc[i].to_dict() for i in range(len(df)) ]
con.execute(users.insert(),data)
最佳答案
你是在自问自答。您只是缺少导入。将以下行添加到示例代码中,它应该可以工作:)
import sqlite3
sqlite3.register_adapter(np.int64, lambda val: int(val))
因此,您的示例现在将如下所示:
import sqlite3
import pandas as pd
import sqlalchemy as sql
import numpy as np
sqlite3.register_adapter(np.int64, lambda val: int(val))
eng = sql.create_engine('sqlite:///C:/test.db')
df = pd.DataFrame({'name':['a','b'],'integer': np.random.randint(5,size=2)})
with eng.connect() as con:
metadata = sql.MetaData()
users = sql.Table('users', metadata,
sql.Column('id', sql.Integer, primary_key=True),
sql.Column('name', sql.String),
sql.Column('integer', sql.Integer)
)
metadata.create_all(con)
data = [ df.iloc[i].to_dict() for i in range(len(df)) ]
con.execute(users.insert(),data)