Skip to content

Instantly share code, notes, and snippets.

@bacher09
Created September 19, 2014 11:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bacher09/d7ab8021fc8b3ad0adf0 to your computer and use it in GitHub Desktop.
Save bacher09/d7ab8021fc8b3ad0adf0 to your computer and use it in GitHub Desktop.
sqlalchemy columns rearrange
from sqlalchemy import create_engine, Column, Integer, MetaData, Table, String
from sqlalchemy.sql import select, Select, ColumnCollection
engine = create_engine('sqlite:///:memory:', echo=True)
metadata = MetaData()
class RearrangeSelect(Select):
def reverse_columns(self):
return self.with_only_columns(list(self.inner_columns)[::-1])
def reorder_columns(self, *args):
columns = ColumnCollection()
for c in self.inner_columns:
columns.add(c)
query_cols = []
for name in args:
c = getattr(columns, name, None)
if c is None:
raise ValueError('Bad column name "%s"' % name)
query_cols.append(c)
return self.with_only_columns(query_cols)
test = Table('test', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('num', Integer, default=0),
)
metadata.create_all(engine)
statement = RearrangeSelect([test]).group_by(test.c.id)
print(statement)
print(statement.reverse_columns())
print(statement.reorder_columns('num', 'name'))
print(statement.reorder_columns('name', 'id'))
from sqlalchemy import create_engine, Column, Integer, MetaData, Table, String
from sqlalchemy.sql import select, Select, ColumnCollection
engine = create_engine('sqlite:///:memory:', echo=True)
metadata = MetaData()
test = Table('test', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('num', Integer, default=0),
)
metadata.create_all(engine)
statement = select([test]).group_by(test.c.id)
print(statement)
cols = list(statement.inner_columns)
print(statement.with_only_columns(cols[::-1]))
print(statement.with_only_columns([cols[2], cols[0]]))
columns = ColumnCollection()
for c in cols:
columns.add(c)
print(statement.with_only_columns([columns.name, columns.id]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment