我想使用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)

10-07 19:30
查看更多