root / snf-pithos-backend / pithos / backends / lib / sqlalchemy / alembic / versions / 54dbdde2d187_split_plankton_prope.py @ 1ec05716
History | View | Annotate | Download (2.7 kB)
1 | 1ec05716 | Sofia Papagiannaki | """Split plankton properties
|
---|---|---|---|
2 | 1ec05716 | Sofia Papagiannaki |
|
3 | 1ec05716 | Sofia Papagiannaki | Revision ID: 54dbdde2d187
|
4 | 1ec05716 | Sofia Papagiannaki | Revises: 3b62b3f1bf6c
|
5 | 1ec05716 | Sofia Papagiannaki | Create Date: 2014-01-21 11:44:34.783895
|
6 | 1ec05716 | Sofia Papagiannaki |
|
7 | 1ec05716 | Sofia Papagiannaki | """
|
8 | 1ec05716 | Sofia Papagiannaki | |
9 | 1ec05716 | Sofia Papagiannaki | # revision identifiers, used by Alembic.
|
10 | 1ec05716 | Sofia Papagiannaki | revision = '54dbdde2d187'
|
11 | 1ec05716 | Sofia Papagiannaki | down_revision = '3b62b3f1bf6c'
|
12 | 1ec05716 | Sofia Papagiannaki | |
13 | 1ec05716 | Sofia Papagiannaki | from alembic import op |
14 | 1ec05716 | Sofia Papagiannaki | import sqlalchemy as sa |
15 | 1ec05716 | Sofia Papagiannaki | |
16 | 1ec05716 | Sofia Papagiannaki | import json |
17 | 1ec05716 | Sofia Papagiannaki | |
18 | 1ec05716 | Sofia Papagiannaki | from collections import defaultdict |
19 | 1ec05716 | Sofia Papagiannaki | |
20 | 1ec05716 | Sofia Papagiannaki | |
21 | 1ec05716 | Sofia Papagiannaki | def upgrade(): |
22 | 1ec05716 | Sofia Papagiannaki | c = op.get_bind() |
23 | 1ec05716 | Sofia Papagiannaki | a = sa.sql.table( |
24 | 1ec05716 | Sofia Papagiannaki | 'attributes',
|
25 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('serial', sa.Integer),
|
26 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('domain', sa.String),
|
27 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('key', sa.String),
|
28 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('value', sa.String),
|
29 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('node', sa.Integer),
|
30 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('is_latest', sa.Boolean))
|
31 | 1ec05716 | Sofia Papagiannaki | |
32 | 1ec05716 | Sofia Papagiannaki | s = sa.select([a.c.serial, |
33 | 1ec05716 | Sofia Papagiannaki | a.c.domain, |
34 | 1ec05716 | Sofia Papagiannaki | a.c.key, |
35 | 1ec05716 | Sofia Papagiannaki | a.c.value, |
36 | 1ec05716 | Sofia Papagiannaki | a.c.node, |
37 | 1ec05716 | Sofia Papagiannaki | a.c.is_latest]) |
38 | 1ec05716 | Sofia Papagiannaki | cond = sa.sql.and_(a.c.domain == 'plankton',
|
39 | 1ec05716 | Sofia Papagiannaki | a.c.key == 'plankton:properties')
|
40 | 1ec05716 | Sofia Papagiannaki | s = s.where(cond) |
41 | 1ec05716 | Sofia Papagiannaki | entries = c.execute(s).fetchall() |
42 | 1ec05716 | Sofia Papagiannaki | if not entries: |
43 | 1ec05716 | Sofia Papagiannaki | return
|
44 | 1ec05716 | Sofia Papagiannaki | |
45 | 1ec05716 | Sofia Papagiannaki | values = [] |
46 | 1ec05716 | Sofia Papagiannaki | for e in entries: |
47 | 1ec05716 | Sofia Papagiannaki | d = dict(e.items())
|
48 | 1ec05716 | Sofia Papagiannaki | properties = json.loads(e['value'])
|
49 | 1ec05716 | Sofia Papagiannaki | for k, v in properties.items(): |
50 | 1ec05716 | Sofia Papagiannaki | copy = d.copy() |
51 | 1ec05716 | Sofia Papagiannaki | copy.update({'key': 'plankton:property_%s' % k, |
52 | 1ec05716 | Sofia Papagiannaki | 'value': v})
|
53 | 1ec05716 | Sofia Papagiannaki | values.append(copy) |
54 | 1ec05716 | Sofia Papagiannaki | |
55 | 1ec05716 | Sofia Papagiannaki | op.bulk_insert(a, values) |
56 | 1ec05716 | Sofia Papagiannaki | |
57 | 1ec05716 | Sofia Papagiannaki | d = a.delete().where(cond) |
58 | 1ec05716 | Sofia Papagiannaki | op.execute(d) |
59 | 1ec05716 | Sofia Papagiannaki | |
60 | 1ec05716 | Sofia Papagiannaki | |
61 | 1ec05716 | Sofia Papagiannaki | def downgrade(): |
62 | 1ec05716 | Sofia Papagiannaki | c = op.get_bind() |
63 | 1ec05716 | Sofia Papagiannaki | a = sa.sql.table( |
64 | 1ec05716 | Sofia Papagiannaki | 'attributes',
|
65 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('serial', sa.Integer),
|
66 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('domain', sa.String),
|
67 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('key', sa.String),
|
68 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('value', sa.String),
|
69 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('node', sa.Integer),
|
70 | 1ec05716 | Sofia Papagiannaki | sa.sql.column('is_latest', sa.Boolean))
|
71 | 1ec05716 | Sofia Papagiannaki | |
72 | 1ec05716 | Sofia Papagiannaki | s = sa.select([a.c.serial, |
73 | 1ec05716 | Sofia Papagiannaki | a.c.domain, |
74 | 1ec05716 | Sofia Papagiannaki | a.c.key, |
75 | 1ec05716 | Sofia Papagiannaki | a.c.value, |
76 | 1ec05716 | Sofia Papagiannaki | a.c.node, |
77 | 1ec05716 | Sofia Papagiannaki | a.c.is_latest]) |
78 | 1ec05716 | Sofia Papagiannaki | cond = sa.sql.and_(a.c.domain == 'plankton',
|
79 | 1ec05716 | Sofia Papagiannaki | a.c.key.like('plankton:property_%'))
|
80 | 1ec05716 | Sofia Papagiannaki | s = s.where(cond) |
81 | 1ec05716 | Sofia Papagiannaki | entries = c.execute(s).fetchall() |
82 | 1ec05716 | Sofia Papagiannaki | if not entries: |
83 | 1ec05716 | Sofia Papagiannaki | return
|
84 | 1ec05716 | Sofia Papagiannaki | |
85 | 1ec05716 | Sofia Papagiannaki | props = defaultdict(dict)
|
86 | 1ec05716 | Sofia Papagiannaki | for e in entries: |
87 | 1ec05716 | Sofia Papagiannaki | k = e.key.replace('plankton:property_', '', 1) |
88 | 1ec05716 | Sofia Papagiannaki | props[(e.serial, e.domain, e.node, e.is_latest)][k] = e.value |
89 | 1ec05716 | Sofia Papagiannaki | |
90 | 1ec05716 | Sofia Papagiannaki | values = [] |
91 | 1ec05716 | Sofia Papagiannaki | for k in props: |
92 | 1ec05716 | Sofia Papagiannaki | serial, domain, node, is_latest = k |
93 | 1ec05716 | Sofia Papagiannaki | values.append({'serial': serial,
|
94 | 1ec05716 | Sofia Papagiannaki | 'domain': domain,
|
95 | 1ec05716 | Sofia Papagiannaki | 'node': node,
|
96 | 1ec05716 | Sofia Papagiannaki | 'is_latest': is_latest,
|
97 | 1ec05716 | Sofia Papagiannaki | 'key': 'plankton:properties', |
98 | 1ec05716 | Sofia Papagiannaki | 'value': json.dumps(props[k])})
|
99 | 1ec05716 | Sofia Papagiannaki | |
100 | 1ec05716 | Sofia Papagiannaki | op.bulk_insert(a, values) |
101 | 1ec05716 | Sofia Papagiannaki | |
102 | 1ec05716 | Sofia Papagiannaki | d = a.delete().where(cond) |
103 | 1ec05716 | Sofia Papagiannaki | op.execute(d) |