sqlalchemy/sql索引与pandas中的索引相比如何?

nx7onnlm  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(351)

我正在学习炼金术,我对Pandas有点熟悉。现在,我试图理解sqlalchemy和sql数据库中索引的概念。

在Pandas身上

在pandas中,索引是column1的标识符或“地址”。简单的表可以如下所示:

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总是只有一个索引,但在某些情况下,可能存在索引是多索引的情况。

在炼金术中

在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)

看起来像这样

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删除了一些行。

sc4hvdpw

sc4hvdpw1#

pandas中的索引与行相关联。然而,在sqlalchemy中,它与关系数据库中的索引概念相关联。
索引(在数据库中)是一种提高数据检索速度的数据结构(或您希望看到的类似工具)(请参见数据库索引)

相关问题