【发布时间】: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