使用 sqlalchemy 在 sqlite 数据库中保存 numpy 整数



我想使用 sqlalchemy 将数据从 pandas DataFrame 保存到 sqlite 数据库中。(我知道我可以使用熊猫的.to_sql,但是如果某些东西不能正常工作,我发现直接使用sqlchemy更容易。

某些列包含 numpy 整数。当我尝试将它们作为sql.Integer保存到数据库时,它们实际上被保存为二进制文件。我认为这里给出了为什么会发生这种情况的答案,它还显示了在使用 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)

最新更新