from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
engine = create_engine(‘mysql+pymysql://root:@localhost/python’)
Base = declarative_base()
class User(Base):
tablename = ‘users’
id = Column(Integer, primary_key=True)
name = Column(String(20))
fullname = Column(String(20))
nickname = Column(String(20))
def __repr__(self):
return "<User(name='%s', fullname='%s', nickname='%s')>" % \
(self.name, self.fullname, self.nickname)
1 |
|
创建映射类的实例
1 | print(ed_user.fullname) |
创建会话 与数据库对话
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
or 如果没有定义engine
1 | Session.configure(bind=engine) |
添加或更新对象
1 | our_user = session.query(User).filter_by(name='mash').first() |
1 | 执行查询将相当于执行如果语句, orm有数据了,但数据库里尚未插入 |
1 | INSERT INTO users (name, fullname, nickname) VALUES (?, ?, ?) |
1 | #### 可以增加多个user对象 |
入库
1 | ### 查询 |
filter_by 使用关键字参数 .filter_by(name=”mash”)
filter 使用sql表达式语言构造
1 | filter(User.name != 'mash') |
返回列表和标量
1 | session.query(User).filter(...).order_by(User.id).all() |
1 | print(query.scalar()) |
使用文本sql
from sqlalchemy import text1
2.order_by(text('id')).all():
print(user.name)
1 | params(id = 224, name='mash').order_by(User.id).one() |
1 | .params(name='mash').all(): |
聚合
from sqlalchemy import func1
print(count)
1 | print(users) |
1 |
|
使用相关对象
1 | print(jack.addresses) |
1 | Address(email_address='jack@google.com'), |
1 | print(jack.addresses[1].user) |
保存
1 | session.commit() |
1 | print(jack) |
使用连接查询
1 | filter(User.id == Address.user_id). \ |
1 | filter(Address.email_address == 'jack@google.com') |
1 | query.join(User.addresses) # specify relationship from left to right |
1 | print(sql) => select from users left outer join addresses on ... |
Query 如果存在多个实体,请从中选择?
1 | 在实体列表中,如果省略了ON子句,或者ON子句是纯SQL表达式。要控制联接列表中的第一个实体, |
1 | print(query) => select from addresses inner join users on ... |
减少查询 预先加载方式之一
from sqlalchemy.orm import joinedload
1 |
|
配置关联删除
1 | addresses = relationship("Address", back_populates='user',cascade="all, delete, delete-orphan") |
建立多对多 (需要创建中间表)
from sqlalchemy import Table, Text
post_keywords = Table(‘post_keywords’, Base.metadata,
Column(‘post_id’, ForeignKey(‘posts.id’), primary_key=True),
Column(‘keyword_id’, ForeignKey(‘keywords.id’), primary_key=True)
)
class BlogPost(Base):
tablename = ‘posts’
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey(‘users.id’))
handline = Column(String(100), nullable=False)
body = Column(Text)
keywords = relationship('Keyword', secondary=post_keywords, back_populates='posts')
def __init__(self, handline, body, author):
self.author = author
self.handline = handline
self.body = body
def __repr__(self):
return 'BlogPost(%r, %r, %r)' % (self.handline, self.body, self.author)
class Keyword(Base):
tablename = ‘keywords’
id = Column(Integer, primary_key=True)
keyword = Column(String(50), nullable=False, unique=True)
posts = relationship(‘BlogPost’, secondary=post_keywords, back_populates=’keywords’)
def __init__(self, keyword):
self.keyword = keyword
1 | 我们将把它添加为另一个双向关系, |
BlogPost.author = relationship(User, back_populates=’posts’)
User.posts = relationship(BlogPost, back_populates=’author’, lazy=’dynamic’)
创建表
1 |
|
查询
session.query(BlogPost).filter(BlogPost.keywords.any(keyword='firstword')).all()