我正在学习炼金术,我对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删除了一些行。
1条答案
按热度按时间sc4hvdpw1#
pandas中的索引与行相关联。然而,在sqlalchemy中,它与关系数据库中的索引概念相关联。
索引(在数据库中)是一种提高数据检索速度的数据结构(或您希望看到的类似工具)(请参见数据库索引)