sqlalchemy入门记录

前言

发现翻译全文时间比较久,所以先整个简单的使用说明吧

安装SQLAlchemy

pip install sqlalchemy

查看SQLAlchemy版本

In [1]: import sqlalchemy

In [2]: sqlalchemy.__version__
Out[2]: '1.0.14'

连接数据库

create_engine(数据库://用户名:密码(没有密码则为空)@主机名:端口/数据库名',echo =True)

from sqlalchemy import create_engine
engine = create_engine('mysql://root:@localhost:3306/sqlalchemy', echo=True)

ORM

基类

In [10]: from sqlalchemy.ext.declarative import declarative_base

In [11]: Base = declarative_base()

In [12]: from sqlalchemy import Column, Integer, String

In [13]: class User(Base):
   ....:     __tablename__ = 'users'
   ....:     id = Column(Integer, primary_key=True)
   ....:     name = Column(String(255))
   ....:     password = Column(String(255))

创建表

In [15]: Base.metadata.create_all(engine)
2016-08-31 15:12:56,639 INFO sqlalchemy.engine.base.Engine DESCRIBE `users`
2016-08-31 15:12:56,639 INFO sqlalchemy.engine.base.Engine ()
2016-08-31 15:12:56,649 INFO sqlalchemy.engine.base.Engine ROLLBACK
2016-08-31 15:12:56,651 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE users (
        id INTEGER NOT NULL AUTO_INCREMENT, 
        name VARCHAR(255), 
        password VARCHAR(255), 
        PRIMARY KEY (id)
)


2016-08-31 15:12:56,652 INFO sqlalchemy.engine.base.Engine ()
2016-08-31 15:12:56,684 INFO sqlalchemy.engine.base.Engine COMMIT

查看是否创建成功

In [17]:  engine.table_names()
2016-08-31 15:14:00,572 INFO sqlalchemy.engine.base.Engine SHOW FULL TABLES FROM `sqlalchemy`
2016-08-31 15:14:00,572 INFO sqlalchemy.engine.base.Engine ()
Out[17]: [u'users']

使用Session

初始化一个Session对象

In [18]: from sqlalchemy.orm import sessionmaker

In [19]: Session = sessionmaker(bind=engine)

In [23]: session = Session()

或者

In [20]: Session = sessionmaker()

In [21]: Session.configure(bind=engine)

In [23]: session = Session()

添加/更新对象

In [22]: user_1 = User(id=1, name='wang', password='123') 

In [24]: session.add(user_1)

In [26]: user_2 = User(id=2, name='qian', password='234')                                                                                                                                         

In [27]: user_3 = User(id=3, name='sun', password='345')

In [28]: session.add_all([user_2, user_3])

In [29]: session.dirty
Out[29]: IdentitySet([])

In [30]: session.new
Out[30]: IdentitySet([<__main__.User object at 0x7fc6a805ad50>, <__main__.User object at 0x7fc6a805a910>, <__main__.User object at 0x7fc6a805ac90>])

In [31]: user_1.id
Out[31]: 1

In [32]: session.commit()
2016-08-31 15:26:17,798 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2016-08-31 15:26:17,799 INFO sqlalchemy.engine.base.Engine INSERT INTO users (id, name, password) VALUES (%s, %s, %s)
2016-08-31 15:26:17,800 INFO sqlalchemy.engine.base.Engine ((1, 'wang', '123'), (2, 'qian', '234'), (3, 'sun', '345'))
2016-08-31 15:26:17,802 INFO sqlalchemy.engine.base.Engine COMMIT

In [33]: user_1.password = '1234'

In [34]: session.dirty
Out[34]: IdentitySet([<__main__.User object at 0x7fc6a805a910>])

回滚(做了修改但是还未提交)

In [33]: user_1.password = '1234'

In [34]: session.dirty
Out[34]: IdentitySet([<__main__.User object at 0x7fc6a805a910>])

In [37]: session.rollback()

In [38]: session.dirty
Out[38]: IdentitySet([])

查询

In [39]: session.query(User).filter_by(name='wang')
Out[39]: <sqlalchemy.orm.query.Query at 0x7fc6a801bfd0>

In [40]: session.query(User).filter_by(name='wang').first()
2016-08-31 15:36:07,500 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2016-08-31 15:36:07,500 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.password AS users_password 
FROM users 
WHERE users.name = %s 
 LIMIT %s
2016-08-31 15:36:07,501 INFO sqlalchemy.engine.base.Engine ('wang', 1)
Out[40]: <__main__.User at 0x7fc6a805a910>

# all()
In [41]: session.query(User).filter_by(password='123').all()                    
2016-08-31 15:36:32,016 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.password AS users_password 
FROM users 
WHERE users.password = %s
2016-08-31 15:36:32,016 INFO sqlalchemy.engine.base.Engine ('123',)
Out[41]: [<__main__.User at 0x7fc6a805a910>]

In [43]: for instance in session.query(User).order_by(User.id):
    print instance.id, instance.name
   ....:     
2016-08-31 15:37:51,553 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.password AS users_password 
FROM users ORDER BY users.id
2016-08-31 15:37:51,554 INFO sqlalchemy.engine.base.Engine ()
1 wang
2 qian
3 sun

# filter_by
In [52]: for name in session.query(User.name).filter_by(password='123'):
    print name
   ....:     
2016-08-31 15:47:44,062 INFO sqlalchemy.engine.base.Engine SELECT users.name AS users_name 
FROM users 
WHERE users.password = %s
2016-08-31 15:47:44,062 INFO sqlalchemy.engine.base.Engine ('123',)
('wang',)
('qian',)

# order_by
In [54]: for user in session.query(User).order_by(User.id)[1:3]:
    print user.name
   ....:     
2016-08-31 15:51:18,657 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.password AS users_password 
FROM users ORDER BY users.id 
 LIMIT %s, %s
2016-08-31 15:51:18,658 INFO sqlalchemy.engine.base.Engine (1, 2)
qian
sun

查询的时候通用过滤符号

# equal
query.filter(User.name == 'ed')

# not equal
query.filter(User.name != 'ed')

# like 
query.filter(User.name.like('%ed%'))

# in
query.filter(User.name.in_(['ed', 'wendy', 'jack']))

# not in
query.filter(~User.name.in_(['ed', 'wendy', 'jack']))

# add

# use and_()
from sqlalchemy import and_
query.filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))

# or send multiple expressions to .filter()
query.filter(User.name == 'ed', User.fullname == 'Ed Jones')

# or chain multiple filter()/filter_by() calls
query.filter(User.name == 'ed').filter(User.fullname == 'Ed Jones')

# or --Make sure you use or_() and not the Python or operator!
from sqlalchemy import or_
query.filter(or_(User.name == 'ed', User.name == 'wendy'))

# match
query.filter(User.name.match('wendy'))

返回list或者scalar

all() 列表

first() scalar

one() one_or_none()  scalar()

参考

sqlalchemy官网

posted @ 2016-08-31 16:11  wswang  阅读(4327)  评论(0编辑  收藏  举报