- sqlalchemy的orm部分:
- 版本检查:
import sqlalchemy print sqlalchemy.__version__
- connecting:
# 导入模块 from sqlalchemy import create_engine # 创建引擎 engine = create_engine('...')
- 声明映射-->可理解为创建一个基类
然后就可以使用创建的基类来创建一个用户表from sqlalchemy.ext.declarative import declarative_base Base = declarative_base()
在交互模式可以通过from sqlalchemy import Column,Integer,String class User(Base): __tablename__ = 'user' id = Column(Integer,primary_key=True) name = Column(String(10)) pwd = Column(String(100)) def __repr__(self): return '<User(id:%s,name:%s,pwd:%s)>'%(self.id,self.name,self.pwd)
类名+__table__
的形式查看sqlalchemy创建表的具体格式。如:User.__table__
注:这种操作仅限于交互模式下。 最后把模型映射到数据库中Base.metadata.create_all(engine)
4. 创建一个映射实例:注:以上操作只存在于内存中 5. 创建一个会话use = User(name='python',pwd='123456') # 访问实例中的属性 print user.name
或from sqlalchemy.orm import sessionmaker # 绑定会话引擎 Session = sessionmaker(bind=engine)
以上两者表示的是同一个意思,然后生成session。Session = sessionmaker() Session.configure(bind=engine)
session = Session()
6. 添加和更新Objects(实体) session通过add()添加对象实体。如:session.add(user)
查询数据库中的内容:session.add_all()可以添加多个实例对象,但其参数为list,如:user = session.query(User).filter_by(name='python').first() print user
提交session添加的内容到数据库:session.add_all([ User(name='n1',pwd='p1'), User(name='n2',pwd='p2'), User(name='n3',pwd='p3'),... ])
session.commit()
- 回滚:(roll back) 回滚只能操作session中的数据,而不能操作数据库中的数据。如:
如果在回滚前有提交user = User(name='flask',pwd='123') session.add(user) users = session.query(User).filter(User.name.in_(['python','flask'])).all() print user in users or 'fail' print 'success' session.rollback() users = session.query(User).filter(User.name.in_(['python','flask'])).all() print user in users or 'fail' print 'success'
session.commit()
操作的话。回滚是失效的。 8. Query对象返回的数据可迭代。 9. 外键:from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship class Address(Base): __tablename__ = 'address' id = Column(Integer,primary_key=True) email = Column(String(20)) user_id = Column(Integer,ForeignKey('user.id')) user = relationship('User',backref='addresses')
- 关联外键对象:
user = session.query(User).filter(User.name=='python').first() print user.addresses user.addresses = [ Address(email='123@qq.com'), Address(email='456@qq.com'), Address(email='789@qq.com') ] print user.addresses
- 多表查询 方法一:
方法二:for u,a in session.query(User,Address).filter(User.id==Address.id).filter(Address.email=='123@qq.com').all() print 'u:%s,a:%s'%(u,a)
左外连接session.query(User).join(Address).filter(Address.email=='123@qq.com').all()
outerjoin
。解释一下join与outerjoin: join的意思是匹配交集,outerjoin的意思是输出所有前面的并前面的匹配后面的。 12. 别名:Aliases
-->往往用于表的自身匹配。from sqlalchemy.orm import aliased adalias1 = aliased(Address) adalias2 = aliased(Address)
- 子查询
等同于from sqlalchemy.sql import func rs = session.query(Address.user_id,func.count('*').label('address_count')).group_by(Address.user_id).subquery()
SELECT user.*,adr_count.address_count FROM users LEFT OUTER JOIN(SELECT user_id,count(*) AS address_count FROM addresses GROIP BY user_id) AS adr_count ON users.id=adr_count.user_id
- EXISTS用法
等同于from sqlalchemy.sql import exists rs = exists().where(Address.user_id==User.id) for name, in session.query(User.name).filter(rs): print name
SELECT user.name AS users_name FROM users WHERE EXISTS (SELECT * FROM addresses WHERE addresses.user_id = user.id)
- 多对多 多对多需要中间表 关系属性需要更改,参数一都指向对方表,参数二用secondary指向第三张表,第三张表需要连接两张表的id作为主键
- '关系懒惰':
是指relationship中添加了lazy属性并且赋值
dynamic
,返回的是query对象。默认等于selector
。
-
Notifications
You must be signed in to change notification settings - Fork 0
mistacker/mysqlalchemy
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
About
No description, website, or topics provided.
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published