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

标签 python sqlite numpy sqlalchemy integer

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

相关文章:

sql - SOLite :Date formatter in SQLite

python - xtensor 的 "operator/"比 numpy 的 "/"慢

python - 连接多个不同长度的Dataframe

python - 单击外部 url 链接时窗口不会打开新窗口或选项卡

python - 将 matlab "find"转换为 "numpy",其中

python - 模块 'skimage.filters' 没有属性 'gaussian_filter'

iphone - SQLite Select 语句的更好性能

java - Android SimpleCursorAdapter.ViewBinder 不更新绑定(bind)的 TextView

python - Tensorflow Metal 插件已注册错误

python - 切片 NumPy 数组 - 选择与某些索引对应的值