SQLAlchemy 连接 MySQL 数据库(二)
来源:互联网 发布:数据分析主要分析哪些 编辑:程序博客网 时间:2024/05/16 17:51
一、数据创建
如果想要和 MySQL 交谈也得先通过 SQLAlchemy 建立一个会话:
from sqlalchemy.orm import sessionmaker# 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例Session_class = sessionmaker(bind=engine)session = Session_class() # 生成session实例,相当于游标
通过session对象,session可以记录和跟踪数据的改变,在适当的时候提交,并且支持强大的ORM的功能。生成会话之后,我们需要一些测试数据。而 Faker 就是用来生成虚假数据的库。安装:
$ pip install faker
下面结合 Faker 库创建一些测试数据:
def Create(session): #创建了10个用户 faker_users = [User( username=faker.name(), password=faker.word(), email=faker.email(), ) for i in range(10)] session.add_all(faker_users) # 5个分类 faker_categories = [Category(name=faker.word()) for i in range(5) ] session.add_all( faker_categories ) # 20个标签 faker_tags = [Tag(name=faker.word()) for i in range(20)] session.add_all(faker_tags) # 100篇文章 for i in range(100): article = Article( title = faker.sentence(), content = ' '.join( faker.sentences(nb=random.randint(10,20))), author = random.choice(faker_users), category = random.choice(faker_categories), ) for tag in random.sample(faker_tags,random.randint(2,5)): article.tags.append(tag) session.add(article) session.commit()if __name__ == '__main__': #Base.metadata.create_all(engine) faker = Factory.create() Session_class = sessionmaker(bind=engine) session = Session_class() Create(session)
在上面的代码中我们创建了10个用户,5个分类,20个标签,100篇文章,并且为每篇文章随机选择了2~5个标签。
使用 SQLAlchemy 往数据库中添加数据,我们只需要创建相关类的实例,调用 session.add() 添加一个,或者 session.add_all() 一次添加多个, 最后 session.commit() 就可以了。
二、查询
数据库最常用的就是查询功能,这里查询(Query)对象就是通过Session会话的query()方法获取的,需要注意的是这个方法的参数数目是可变的,也就是说我们可以传入任意多的参数数目,参数的类型可以是任意的类组合或者是类的名称。
1、返回列表和标量
(1).比如:
def Query_Iteration(session): # 此处得到Query对象返回的是一组可迭代的User实例表 for user in session.query(User): print( "( username : %s ) , ( password : %s ),( email : %s )" % (user.username,user.password , user.email) )
此处得到Query对象返回的是一组可迭代的User实例表,后我们通过for in语句访问,依次输出 用户名:user.username , 密码:user.password 和 邮箱:user.email 。
(2).当然如果只需要“用户名”和“密码”,对于对象实例的其他属性不感兴趣的话,也可以直接查询它们(类的属性名称)
def Query_Iteration1(session): for name,password in session.query(User.username , User.password): print( " %s , %s " % ( name , password) )
(3).SQLAlchemy的Query对象可以通过Python数组分片来实现控制记录的数目和位置。
def Query_Iteration2(session): for user in session.query(User).order_by(User.id)[1:3]: print(" %s , %s " % ( user.username,user.password) )
(4).假如我们需要筛选过滤特定结果,则可以使用filter_by()方法,这个方法使用关键词参数:
def Query_Iteration3(session): for user in session.query(User).filter_by( username='Cheryl Jackson'): print(user.password)
此处说明查询User表,按照User表中username=’Cheryl Jackson’过滤结果。
(5).Query对象的all()、one()以及first()方法将返回非迭代值,比如说all()返回的是一个列表,
first()方法限制并仅作为标量返回结果集的第一条记录,
2、使用原义SQL
Query对象能够灵活的使用原义SQL查询字符串作为查询参数。
def Query_SQL(session): users = session.execute('select * from users') for u in users: print(u)
三、更新和添加
# 更新一个字段def Update(session): a = session.query(Article).get(10) a.title = 'test' session.add(a) session.commit()
session.query(Article).get(10)返回的是Article表中第10条记录。
# 插入新用户,def Add_User(session): new_user = User( username = 'wang' , password='23',email='111@abc.com') session.add( new_user ) session.commit()
四、删除
def Delete(session): a = session.query(Article).get(10) session.delete(a) session.commit()
删除直接调用 delete 删除获取到的对象,提交 session 即可。
五、完整代码
# coding: utf-8from sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, String, Integer , Textfrom sqlalchemy.orm import relationshipfrom sqlalchemy import Table,ForeignKeyimport randomfrom sqlalchemy.orm import sessionmakerfrom faker import Factory# 初始化数据库连接:# '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'engine = create_engine('mysql+pymysql://root:0208@localhost:3306/blog?charset=utf8')# 创建对象的基类: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) articles = relationship('Article' , backref='author') userinfo = relationship('UserInfo',backref='user',uselist=False) 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 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 Category(Base): __tablename__ = 'categories' id = Column(Integer,primary_key=True) name = Column(String(64) ,nullable=False,index = True ) articles = relationship('Article',backref='category')# 中间表 自己创建。不需要手动管理,orm自动维护article_tag = Table( 'article_tag',Base.metadata, Column('article_id',Integer,ForeignKey('articles.id')), Column('tag_id',Integer,ForeignKey('tags.id')))class Tag(Base): __tablename__='tags' id = Column(Integer,primary_key=True) name = Column( String(64) , nullable=False , index = True)def CreateData(session): #创建了10个用户 faker_users = [User( username=faker.name(), password=faker.word(), email=faker.email(), ) for i in range(10)] session.add_all(faker_users) # 5个分类 faker_categories = [Category(name=faker.word()) for i in range(5) ] session.add_all( faker_categories ) # 20个标签 faker_tags = [Tag(name=faker.word()) for i in range(20)] session.add_all(faker_tags) # 100篇文章 for i in range(100): article = Article( title = faker.sentence(), content = ' '.join( faker.sentences(nb=random.randint(10,20))), author = random.choice(faker_users), category = random.choice(faker_categories), ) for tag in random.sample(faker_tags,random.randint(2,5)): article.tags.append(tag) session.add(article) session.commit()# 更新一个字段def Update(session): a = session.query(Article).get(20) a.title = 'test' session.add(a) session.commit() # 添加一个标签,在 tags表中添加了新的字段def Add(session): a = session.query(Article).get(20) a.tags.append( Tag(name='Python test')) session.add(a) session.commit()def Delete(session): a = session.query(Article).get(10) session.delete(a) session.commit()def Query_Iteration(session): # 此处得到Query对象返回的是一组可迭代的User实例表 for user in session.query(User).order_by(User.id): print( "( username : %s ) , ( password : %s ),( email : %s )" % (user.username,user.password , user.email) )#当然如果只需要“用户名”和“密码”,也可以直接查询它们(类的属性名称)def Query_Iteration1(session): for name,password in session.query(User.username , User.password): print( " %s , %s " % ( name , password) ) def Query_Iteration2(session): for user in session.query(User).order_by(User.id)[1:3]: print(" %s , %s " % ( user.username,user.password) )def Query_Iteration3(session): for user in session.query(User).filter_by( username='Cheryl Jackson'): print(user.password)def Query_NonIterator(session): # all 则是获取所有 print(session.query(User).all() )def Query_SQL(session): users = session.execute('select * from users') for u in users: print(u)# 插入新用户,def Add_User(session): new_user = User( username = 'wang' , password='23',email='111@abc.com') session.add( new_user ) session.commit()if __name__ == '__main__': #Base.metadata.create_all(engine) faker = Factory.create() Session_class = sessionmaker(bind=engine) session = Session_class() #CreateData(session) #Update(session) #Add(session) Add_User(session) #Delete(session) session.close()
- SQLAlchemy 连接 MySQL 数据库(二)
- sqlalchemy-连接mysql数据库
- SQLAlchemy基础篇(连接mysql数据库)
- SQLAlchemy 连接 MySQL 数据库(一)
- sqlalchemy连接mysql数据库初探
- sqlalchemy 连接mysql 数据库问题
- Python的ORM框架SQLAlchemy使用入门(二)【连接MySql数据库】
- Python的ORM框架SQLAlchemy使用入门(二)【连接MySql数据库】
- Python中使用SQLAlchemy连接Mysql数据库2(多表连接操作)
- Flask-sqlalchemy连接数据库
- 使用SQLAlchemy连接MySQL
- Python中使用SQLAlchemy连接Mysql数据库(单表操作)
- Python中使用SQLAlchemy连接Mysql数据库3(事务,编码)
- 【python学习笔记】python使用sqlalchemy连接mysql数据库
- flask-SQLALCHEMY 远程连接数据库
- python Flask-SQLAlchemy 连接数据库
- pymysql+Flask-SQLAlchemy连接mysql
- Java连接MySQL数据库 (二)
- getcomputedstyle、currentStyle、style
- 5-6月题目汇总(5.30---6.4)
- BZOJ 2208: [Jsoi2010]连通数
- 线段树 扫面线
- Linux常用命令
- SQLAlchemy 连接 MySQL 数据库(二)
- Python函数的参数数传递方式
- Leslie 趁还没忘掉,赶快记录下来 jsp:useBean
- 【算法作业15】LeetCode 357. Count Numbers with Unique Digits
- 搜索专题 S
- 搜索练习题B-02
- 以前学过智能控制,后来想深 入了解,于是考研,结果没考上,悲催。
- hibernate学习笔记02----持久化对象的状态转换
- 约瑟夫问题解答