【问题标题】:How do SQLAlchemy / SQL Index compare to Index in pandas?SQLAlchemy / SQL 索引与 Pandas 中的索引相比如何?
【发布时间】:2020-07-28 23:08:23
【问题描述】:

我正在学习 SQLAlchemy,我对 pandas 有点熟悉。现在,我正在尝试理解 SQLAlchemy 和 SQL 数据库中索引的概念。

在熊猫中

在 pandas 中,索引是列1 的标识符或“地址”。一个简单的表格可能如下所示:

       car_color car_manufacturer engine_type purchase_date
car_id
12           red             Opel          AA    2020-06-05
13           red             Fiat           B    2020-03-14
17         brown            Volvo           A    2020-01-15
27         black             Opel           A    2020-05-01
30          blue             Opel           B    2020-03-24
32         black             Fiat           A    2020-06-04
39         black             Fiat           A    2020-01-07
53         black             Opel           C    2020-04-25
55           red         Maserati           A    2020-07-13
56         white            Volvo           D    2020-03-05
72          blue             Opel           D    2020-02-22
91        silver             Fiat           D    2020-05-28

car_id 是索引,而其他列只是列。我知道我可以按索引排序。我还可以根据索引选择数据或修改。 Dataframe 始终只有一个索引,但在某些情况下,可能会出现索引为 MultiIndex 的情况。

在 SQLAlchemy 中

SQLAlchemy 中,可以使用如下索引定义架构:

from sqlalchemy import Table, Column, Integer, String, MetaData, Date, Index

meta = MetaData()
mytable = Table(
    'mytable',
    meta,
    Column('car_id', Integer, index=True),
    Column('car_color', String),
    Column('car_manufacturer', String),
    Column('engine_type', String),
    Column('purchase_date', Date, index=True),
    Index('idx_car_mane', 'car_manufacturer', 'engine_type', unique=True),
)

在 SQL 中

现在,如果我检查表创建脚本

from sqlalchemy import create_engine
engine = create_engine('postgresql://postgres:mypass@127.0.0.1:5432/testdatabase', echo=True)
mytable.metadata.create_all(bind=engine)

看起来像这样2

2020-07-29 01:36:26,590 INFO sqlalchemy.engine.base.Engine select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where pg_catalog.pg_table_is_visible(c.oid) and relname=%(name)s
2020-07-29 01:36:26,607 INFO sqlalchemy.engine.base.Engine {'name': 'mytable'}
2020-07-29 01:36:26,618 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE mytable (
        car_id INTEGER,
        car_color VARCHAR,
        car_manufacturer VARCHAR,
        engine_type VARCHAR,
        purchase_date DATE
)


2020-07-29 01:36:26,691 INFO sqlalchemy.engine.base.Engine CREATE UNIQUE INDEX idx_car_mane ON mytable (car_manufacturer, engine_type)
2020-07-29 01:36:26,719 INFO sqlalchemy.engine.base.Engine CREATE INDEX ix_mytable_purchase_date ON mytable (purchase_date)
2020-07-29 01:36:26,761 INFO sqlalchemy.engine.base.Engine CREATE INDEX ix_mytable_car_id ON mytable (car_id)

然后,我手动添加三行

engine.execute(mytable.insert(), car_id=12, car_color='red', car_manufacturer='Opel', engine_type='AA', purchase_date=dt.date(2020, 6, 5))
engine.execute(mytable.insert(), car_id=13, car_color='red', car_manufacturer='Fiat', engine_type='B', purchase_date=dt.date(2020, 3, 14))
engine.execute(mytable.insert(), car_id=17, car_color='brown',car_manufacturer='Volvo',  engine_type='A',  purchase_date=dt.date(2020, 1, 15))

并使用 pgAdmin 查看数据库:

我可以看到假设有 5 列,但索引没有绘制到与列相同的表中,而是在“索引”下单独列出。

问题

SQLAlchemy/SQL 中的索引概念一般与 pandas 中的概念相似吗?如果不是,有什么区别?


1 虽然也可以定义重复索引。 2 为了清楚起见,删除了一些行。

【问题讨论】:

    标签: python sql sqlalchemy


    【解决方案1】:

    Pandas 中的索引与行相关联。但是在 SQLAlchemy 中是与关系数据库中索引的概念相关联的。

    索引(在数据库中)是一种数据结构(或您希望看到的工具),它可以提高数据检索的速度。 (见database index

    【讨论】:

      猜你喜欢
      • 2019-10-02
      • 2020-01-05
      • 1970-01-01
      • 2016-10-30
      • 2011-05-24
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多