我想使用 sqlalchemy 将数据从 pandas 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)
关于python - 使用 sqlalchemy 在 sqlite 数据库中保存 numpy 整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57628273/