# 为方便练习,直接使用sqlite数据库,也可替换为mysql
from sqlalchemy import create_engine, Column, String, Integer, Text, ForeignKey, Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
engine = create_engine(‘sqlite:///test.db‘)
Base = declarative_base()
class User(Base):
__tablename__ = ‘users‘
# 添加字段 整型 主键
id = Column(Integer, primary_key=True)
# 字符串 非空 创建索引 查找快,添加新数据慢
username = Column(String(64), nullable=False, index=True)
password = Column(String(64), nullable=False)
email = Column(String(64), nullable=False, index=True)
def __repr__(self):
return ‘%s(%r)‘ % (self.__class__.__name__, self.username)
class Article(Base):
__tablename__ = ‘articles‘
id = Column(Integer, primary_key=True)
title = Column(String(255), nullable=False, index=True)
# 长文本
content = Column(Text)
# 外键 表名 全小写 的某个字段
# 一对一,或者一对多,在一的一方定义
user_id = Column(Integer, ForeignKey(‘users.id‘))
cate_id = Column(Integer, ForeignKey(‘categories.id‘))
tags = relationship(‘Tag‘, secondary=‘article_tag‘, backref=‘articles‘)
def __repr__(self):
return ‘%s(%r)‘ % (self.__class__.__name__, self.title)
class Category(Base):
__tablename__ = ‘categories‘
id = Column(Integer, primary_key=True)
name = Column(String(64), nullable=False, index=True)
# 非字段定义,而是提供一个接口方便调用与之关联的其他表格中的数据
# 与之关联的类名 回调参数(属性)
articles = relationship(‘Article‘, backref=‘category‘)
def __repr__(self):
return ‘%s(%r)‘ % (self.__class__.__name__, self.name)
class UserInfo(Base):
__tablename__ = ‘userinfos‘
id = Column(Integer, primary_key=True)
name = Column(String(64))
qq = Column(String(11))
phone = Column(String(11))
link = Column(String(64))
user_id = Column(Integer, ForeignKey(‘users.id‘))
class Tag(Base):
__tablename__ = ‘tags‘
id = Column(Integer, primary_key=True)
name = Column(String(64), nullable=False, index=True)
def __repr__(self):
return ‘%s(%r)‘ % (self.__class__.__name__, self.name)
# 多对多关系时,需创建Table对象 ,
article_tag = Table(
# 表名 固定类
‘article_tag‘, Base.metadata,
# 指定外键
Column(‘article_id‘, Integer, ForeignKey(‘articles.id‘)),
Column(‘tag_id‘, Integer, ForeignKey(‘tags.id‘))
)
if __name__ == ‘__main__‘:
# 可实现创建以上定义的所有类的表格
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
sess = Session()
# 增的逻辑
sess.add(User(
# 当主键存在时,会报错
# id=1,
username=‘Nihao‘,
password="dsfk",
email=‘sdkjf‘
))
# 下面的代码用于批量添加
# sess.add_all([
# User(xxxxxx,) for _ in range(5)
# ])
# for i in range(100):
# article = Article(
# title=‘‘,
# content=‘ ‘,
# author=‘‘,
# category=‘‘
# )
# for tag in random.sample(faker_tags, random.randint(2, 5)):
# 多对多关系时,直接调用某个对象的 字段名
# 添加的tag实例 为 指定的某个tag对象
# article.tags.append(tag)
# session.add(article)
sess.commit()
# print(sess.commit())
# 删
# 类名 过滤条件 类名字段 使用delete()方法 每次需要commit方法才能完成相关操作
sess.query(User).filter(User.id == 3).delete()
sess.commit()
# 改
# sess.query(User).filter(User.id > 0).update({‘username‘: ‘哇哈哈‘})
# #
# sess.query(User).filter(User.id > 0).update({‘username‘: User.username + ‘_SB1‘}
# # 当需要改动的内容用到和自身的某个字段拼接时需要添加下面的条件
# , synchronize_session=False
# )
# 当是整型时,直接处理即可
# sess.query(User).filter(User.id > 0).update({‘id‘: User.id * 100})
sess.commit()
# 查
# 此方法避免,速度慢 全部
res = sess.query(User).all()
for item in res:
pass
# print(item.username)
# 排序 可传入多个参数, 逗号隔开,主要的参数在前
res = sess.query(User.username).order_by(User.id).all()
# 只查第一个
res = sess.query(User.username).first()
# 过滤查 ,号为and
res = sess.query(User).filter(User.id<50,User.id>0).all()
# 效果同上
res = sess.query(User).filter(User.id.between(0,50)).all()
# 筛选查询
res = sess.query(User).filter(User.id.in_([0,500,300])).all()
# 取非
res = sess.query(User).filter(~User.id.in_([0,500,300])).all()
# 多条件时
from sqlalchemy import and_, or_
res = sess.query(User).filter(and_(User.id<5000,User.id>0,User.username=="娃哈哈")).all()
res = sess.query(User).filter(or_(User.id<5000,User.id>60000)).all()
# 条件查询 只能传入参数 xx = xx
res = sess.query(User).filter_by(id=50000)
sess.add(User(
username=‘娃娃wsa‘,
email=‘ds‘,
password=‘dsdfd‘
))
sess.commit()
# 通配符查询 %表示可以是任一字符,至少一个可多个,
res = sess.query(User).filter(User.username.like(‘%w%‘)).all()
# 限制查询
res = sess.query(User).filter(User.username.like(‘%w%‘))[0:2]
for r in res:
print(‘*‘)
print(r.username)
原文:https://www.cnblogs.com/chenxiyuxiao/p/11597461.html