In [1]:
import sqlalchemy
sqlalchemy.__version__


Out[1]:
'1.1.9'

In [25]:
from sqlalchemy import create_engine
engine = create_engine('sqlite:///test.db', echo=False)

In [3]:
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

In [4]:
from sqlalchemy import Column, Integer, String
class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(12))

    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password

    def __repr__(self):
        return '<User {}>'.format(self.fullname)

In [5]:
User.__table__


Out[5]:
Table('users', MetaData(bind=None), Column('id', Integer(), table=<users>, primary_key=True, nullable=False), Column('name', String(length=50), table=<users>), Column('fullname', String(length=50), table=<users>), Column('password', String(length=12), table=<users>), schema=None)

In [40]:
Base.metadata.create_all(engine)
# Base.metadata.drop_all(engine)

In [7]:
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
ed_user.name


Out[7]:
'ed'

In [8]:
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()

In [9]:
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)

In [11]:
our_user = session.query(User).filter_by(name='ed').first()
our_user


2017-05-04 10:57:34,193 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password 
FROM users 
WHERE users.name = ?
 LIMIT ? OFFSET ?
2017-05-04 10:57:34,196 INFO sqlalchemy.engine.base.Engine ('ed', 1, 0)
Out[11]:
<User Ed Jones>

In [12]:
ed_user is our_user


Out[12]:
True

In [13]:
session.add_all([
    User(name='wendy', fullname='Wendy Williams', password='foobar'),
    User(name='mary', fullname='Mary Contrary', password='xxg527'),
    User(name='fred', fullname='Fred Flinstone', password='blah')
])

In [14]:
ed_user.password = 'f8s7ccs'
session.dirty


Out[14]:
IdentitySet([<User Ed Jones>])

In [15]:
session.new


Out[15]:
IdentitySet([<User Wendy Williams>, <User Mary Contrary>, <User Fred Flinstone>])

In [16]:
session.commit()


2017-05-04 10:59:08,734 INFO sqlalchemy.engine.base.Engine UPDATE users SET password=? WHERE users.id = ?
2017-05-04 10:59:08,737 INFO sqlalchemy.engine.base.Engine ('f8s7ccs', 1)
2017-05-04 10:59:08,739 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2017-05-04 10:59:08,740 INFO sqlalchemy.engine.base.Engine ('wendy', 'Wendy Williams', 'foobar')
2017-05-04 10:59:08,741 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2017-05-04 10:59:08,742 INFO sqlalchemy.engine.base.Engine ('mary', 'Mary Contrary', 'xxg527')
2017-05-04 10:59:08,744 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2017-05-04 10:59:08,745 INFO sqlalchemy.engine.base.Engine ('fred', 'Fred Flinstone', 'blah')
2017-05-04 10:59:08,747 INFO sqlalchemy.engine.base.Engine COMMIT

In [17]:
ed_user.id


2017-05-04 11:03:43,698 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2017-05-04 11:03:43,701 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password 
FROM users 
WHERE users.id = ?
2017-05-04 11:03:43,703 INFO sqlalchemy.engine.base.Engine (1,)
Out[17]:
1

In [19]:
ed_user.name = 'Edwardo'
fake_user = User(name='fakeuser', fullname='Invalid', password='12345')
session.add(fake_user)
session.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all()


2017-05-04 11:12:10,829 INFO sqlalchemy.engine.base.Engine UPDATE users SET name=? WHERE users.id = ?
2017-05-04 11:12:10,830 INFO sqlalchemy.engine.base.Engine ('Edwardo', 1)
2017-05-04 11:12:10,832 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2017-05-04 11:12:10,833 INFO sqlalchemy.engine.base.Engine ('fakeuser', 'Invalid', '12345')
2017-05-04 11:12:10,835 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password 
FROM users 
WHERE users.name IN (?, ?)
2017-05-04 11:12:10,837 INFO sqlalchemy.engine.base.Engine ('Edwardo', 'fakeuser')
Out[19]:
[<User Ed Jones>, <User Invalid>]

In [20]:
session.rollback()
ed_user.name
fake_user in session


2017-05-04 11:12:28,308 INFO sqlalchemy.engine.base.Engine ROLLBACK
2017-05-04 11:12:28,312 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2017-05-04 11:12:28,315 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password 
FROM users 
WHERE users.id = ?
2017-05-04 11:12:28,316 INFO sqlalchemy.engine.base.Engine (1,)
Out[20]:
False

In [21]:
session.query(User).filter(User.name.in_(['ed', 'fakeuser'])).all()


2017-05-04 11:14:35,189 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password 
FROM users 
WHERE users.name IN (?, ?)
2017-05-04 11:14:35,191 INFO sqlalchemy.engine.base.Engine ('ed', 'fakeuser')
Out[21]:
[<User Ed Jones>]

In [26]:
for instance in session.query(User).order_by(User.id):
    print(instance.name, instance.fullname)


2017-05-04 11:15:20,751 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password 
FROM users ORDER BY users.id
2017-05-04 11:15:20,753 INFO sqlalchemy.engine.base.Engine ()
ed Ed Jones
wendy Wendy Williams
mary Mary Contrary
fred Fred Flinstone

In [27]:
for name, fullname in session.query(User.name, User.fullname):
    print(name, fullname)


2017-05-04 11:15:47,652 INFO sqlalchemy.engine.base.Engine SELECT users.name AS users_name, users.fullname AS users_fullname 
FROM users
2017-05-04 11:15:47,654 INFO sqlalchemy.engine.base.Engine ()
ed Ed Jones
wendy Wendy Williams
mary Mary Contrary
fred Fred Flinstone

In [28]:
for row in session.query(User, User.name).all():
    print(row.User, row.name)


2017-05-04 11:16:11,972 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password 
FROM users
2017-05-04 11:16:11,974 INFO sqlalchemy.engine.base.Engine ()
<User Ed Jones> ed
<User Wendy Williams> wendy
<User Mary Contrary> mary
<User Fred Flinstone> fred

In [29]:
for row in session.query(User.name.label('name_label')).all():
    print(row.name_label)


2017-05-04 11:17:10,695 INFO sqlalchemy.engine.base.Engine SELECT users.name AS name_label 
FROM users
2017-05-04 11:17:10,697 INFO sqlalchemy.engine.base.Engine ()
ed
wendy
mary
fred

In [31]:
from sqlalchemy.orm import aliased
user_alias = aliased(User, name='user_alias')
for row in session.query(user_alias, user_alias.name).all():
    print(row.user_alias)


2017-05-04 11:18:12,953 INFO sqlalchemy.engine.base.Engine SELECT user_alias.id AS user_alias_id, user_alias.name AS user_alias_name, user_alias.fullname AS user_alias_fullname, user_alias.password AS user_alias_password 
FROM users AS user_alias
2017-05-04 11:18:12,956 INFO sqlalchemy.engine.base.Engine ()
<User Ed Jones>
<User Wendy Williams>
<User Mary Contrary>
<User Fred Flinstone>

In [32]:
for u in session.query(User).order_by(User.id)[1:3]:
    print(u)


2017-05-04 11:18:42,732 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password 
FROM users ORDER BY users.id
 LIMIT ? OFFSET ?
2017-05-04 11:18:42,734 INFO sqlalchemy.engine.base.Engine (2, 1)
<User Wendy Williams>
<User Mary Contrary>

In [33]:
for name, in session.query(User.name).filter_by(fullname='Ed Jones'):
    print(name)


2017-05-04 11:19:23,524 INFO sqlalchemy.engine.base.Engine SELECT users.name AS users_name 
FROM users 
WHERE users.fullname = ?
2017-05-04 11:19:23,526 INFO sqlalchemy.engine.base.Engine ('Ed Jones',)
ed

In [34]:
for name, in session.query(User.name).filter(User.fullname=='Ed Jones'):
    print(name)


2017-05-04 11:19:43,264 INFO sqlalchemy.engine.base.Engine SELECT users.name AS users_name 
FROM users 
WHERE users.fullname = ?
2017-05-04 11:19:43,266 INFO sqlalchemy.engine.base.Engine ('Ed Jones',)
ed

In [35]:
for user in session.query(User).filter(User.name=='ed').filter(User.fullname=='Ed Jones'):
    print(user)


2017-05-04 11:20:37,232 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password 
FROM users 
WHERE users.name = ? AND users.fullname = ?
2017-05-04 11:20:37,235 INFO sqlalchemy.engine.base.Engine ('ed', 'Ed Jones')
<User Ed Jones>

In [36]:
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    email_address = Column(String, nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))
    user = relationship("User", back_populates="addresses")
    
    def __repr__(self):
        return "<Address(email_address={})>".format(self.email_address)

In [37]:
User.addresses = relationship("Address", order_by=Address.id, back_populates="user")

In [39]:
Base.metadata.create_all(engine)

In [41]:
jack = User(name='jack', fullname='Jack Bean', password='gjffdd')
jack.addresses


Out[41]:
[]

In [42]:
jack.addresses = [
    Address(email_address='jack@google.com'),
    Address(email_address='j25@yahoo.com')
]

In [43]:
jack.addresses[1]


Out[43]:
<Address(email_address=j25@yahoo.com)>

In [44]:
jack.addresses[1].user


Out[44]:
<User Jack Bean>

In [45]:
session.add(jack)
session.commit()


2017-05-04 11:41:11,509 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2017-05-04 11:41:11,512 INFO sqlalchemy.engine.base.Engine ('jack', 'Jack Bean', 'gjffdd')
2017-05-04 11:41:11,516 INFO sqlalchemy.engine.base.Engine INSERT INTO addresses (email_address, user_id) VALUES (?, ?)
2017-05-04 11:41:11,517 INFO sqlalchemy.engine.base.Engine ('jack@google.com', 5)
2017-05-04 11:41:11,519 INFO sqlalchemy.engine.base.Engine INSERT INTO addresses (email_address, user_id) VALUES (?, ?)
2017-05-04 11:41:11,520 INFO sqlalchemy.engine.base.Engine ('j25@yahoo.com', 5)
2017-05-04 11:41:11,522 INFO sqlalchemy.engine.base.Engine COMMIT

In [46]:
jack = session.query(User).filter_by(name='jack').one()


2017-05-04 11:42:27,045 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2017-05-04 11:42:27,049 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password 
FROM users 
WHERE users.name = ?
2017-05-04 11:42:27,050 INFO sqlalchemy.engine.base.Engine ('jack',)

In [47]:
jack.addresses


2017-05-04 11:42:38,195 INFO sqlalchemy.engine.base.Engine SELECT addresses.id AS addresses_id, addresses.email_address AS addresses_email_address, addresses.user_id AS addresses_user_id 
FROM addresses 
WHERE ? = addresses.user_id ORDER BY addresses.id
2017-05-04 11:42:38,198 INFO sqlalchemy.engine.base.Engine (5,)
Out[47]:
[<Address(email_address=jack@google.com)>,
 <Address(email_address=j25@yahoo.com)>]

In [48]:
for u, a in session.query(User, Address)\
    .filter(User.id==Address.user_id)\
    .filter(Address.email_address=='jack@google.com')\
    .all():
    print(u, a)


2017-05-04 11:44:35,717 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password, addresses.id AS addresses_id, addresses.email_address AS addresses_email_address, addresses.user_id AS addresses_user_id 
FROM users, addresses 
WHERE users.id = addresses.user_id AND addresses.email_address = ?
2017-05-04 11:44:35,719 INFO sqlalchemy.engine.base.Engine ('jack@google.com',)
<User Jack Bean> <Address(email_address=jack@google.com)>

In [49]:
session.query(User).join(Address)\
    .filter(Address.email_address=='jack@google.com')\
    .all()


2017-05-04 11:47:05,221 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password 
FROM users JOIN addresses ON users.id = addresses.user_id 
WHERE addresses.email_address = ?
2017-05-04 11:47:05,223 INFO sqlalchemy.engine.base.Engine ('jack@google.com',)
Out[49]:
[<User Jack Bean>]

In [ ]: