资讯专栏INFORMATION COLUMN

Tornado-08、SQLAlchemy简单的增删查改

荆兆峰 / 3460人阅读

摘要:环境搭建安装相应的软件包数据库用于连接服务器的一个库连接数据库从中导入,创建引擎建立与数据库的连接。使用方法定义的映射类依据一个基类,这个基类是维系类和数据表关系的目录。应用通常只需要有一个的实例。

SQLAlchemy

1.环境搭建

安装相应的软件包

1.mysql数据库

2.pymysql用于连接MySQL服务器的一个库

3.sqlalchemy

    $ pip install pymysql
    $ pip install sqlalchemy
2.连接数据库

从sqlalchemy中导入create_engin,创建引擎建立与数据库的连接。

from sqlalchemy import create_engine

准备连接数据库的数据:

HOSTNAME = "127.0.0.1"        # 这里填ip地址
PORT = "3306"                 # 端口号 mysql一般默认为3306
DATABASE = "mydb"             # 数据库名
USERNAME = "admin"            # 用户名
PASSWORD = "rootqwe123"       # 用户登录密码

DB_URI的格式:

数据库类型+数据库驱动名称://用户名:密码@机器地址:端口号/数据库名?字符编码

DB_URI=mysql+pymysql://:@/?charset=utf8

engine = create_engine(DB_URI)

我们可以尝试着测试一下是否连接上:

print(dir(engine)),当有打印出方法时,表示连接成功。

database_connect.py

from sqlalchemy import create_engine

HOSTNAME = "127.0.0.1" # 这里填ip地址
PORT = "3306"
DATABASE = "mydb"
USERNAME = "admin"
PASSWORD = "Root110qwe"

Db_Uri = "mysql+pymysql://{}:{}@{}/{}?charset=utf8".format(USERNAME,PASSWORD,HOSTNAME,DATABASE)

engine = create_engine(Db_Uri)

if __name__=="__main__":
    print(dir(engine))


3.创建模型 1.声明映像

对象关系型映射,数据库中的表与python中的类相对应,创建的类必须继承自sqlalchemy中的基类。

使用Declarative方法定义的映射类依据一个基类,这个基类是维系类和数据表关系的目录。

应用通常只需要有一个base的实例。我们通过declarative_base()功能创建一个基类。
在database_connect.py文件中加入下列代码

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base(engine)
2.创建会话

定义个session会话对象,使用 sessionmaker初始化一个类对象

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
session = Session()
3.新建模型

新建一个user模型
新建user_module.py文件

from datetime import datetime
from sqlalchemy import Column,Integer,String,DateTime,Boolean
from database_connect import Base,session

class User(Base):
    __tablename__="user"
    id = Column(Integer,primary_key=True,autoincrement=True)
    username = Column(String(20),nullable=False)
    password = Column(String(100))
    creatime = Column(DateTime,default=datetime.now)
    last_login = Column(DateTime)
    _locked = Column(Boolean,default=Falsem,nullable=False)
    
#---将创建好的user类,映射到数据库的user表中---

在start.py mian函数最后中加入这一行代码

Base.metadata.create_all()    

这就是创建好了一个表,我们可以在数据库中查看一下。

4.增删查改 1.增加数据
def add_user():
    #添加单个对象
    #person = User(username="lethe",password="212121")
    #session.add(person)

#在start.py中的main函数中执行添加函数
    User().add_user()

    #添加多个对象
    #把add_user中的代码注释并添加下列代码
            session.add_all([User(username="banban", password="1212120"),
                User(username="kuku", password="32321")])
    #提交才会生效,和命令行有区别
    session.commit()

2.查询数据
#先将前面的User().add_user()注释掉 否者又会添加相同的数据
def search_user():
    row = session.query(User).all()  # 查询全部数据
    print(row)

#再在start.py中的main函数后面添加
User().search_user()

#将search_user()里的内容注释掉 添加下列代码
row = session.query(User).filter_by(id=1).all()  # 按id查询
print(row)
row = session.query(User).filter(User.username == "banban").all()  # 按字段查询
print(row)
print(row[0].locked)  #查询banban这条信息的locked信息


但其实我们可以在定义user类的时候这么去写

    @classmethod
    def all(cls):
        return session.query(cls).all()

    @classmethod
    def by_id(cls,id):
        return session.query(cls).filter_by(id=id).all()

    @classmethod
    def by_name(cls,name):
        return session.query(cls).filter_by(username=name).all()

    @property
    def locked(self):
        return self._locked

这样在只需要调用类方法就行

    print(User.all())
    print(User.by_id(1))
    print(User.by_name("lethe"))
    print(User.by_name("kuku"))
3.更新
def update_user():
    row = session.query(User).filter_by(username="lethe").update({User.password:"1010101"})
    session.commit()
4.删除
def delete_user():
    row = session.query(User).filter_by(username="banban")[0]  #first
    print(row)
    session.delete(row)
    session.commit()

更新与删除操作过程与前面类似 这里就不一一赘述了
以上就是sqlalchemy的基本知识。

5.pycharm的图形化数据库工具

设置步骤:

点击view-->点击Toll Windows -->点击database

在在pycharm右侧找到database,点开它

点+号-->Data Source--> 选择mysql(我这里是用的mysql,其他数据库也行)

按要求填写对应的项-->点击Test connection 测试一下是否能成功连接(如果这个按钮是灰色的需要先点击左下角的按钮安装插件)


6.附录

start.py

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from user_module import User
from tornado.options import define, options
from database_connect import  engine, session
from user_module import Base
define("port", default=9000, help="run port", type=int)


if __name__ == "__main__":
    connection = engine.connect()
    result = connection.execute("select 1")
    print(Base)
    Base.metadata.create_all()  # 建表
    User().add_user()
    # User().search_user()
    # User().update_user()
    # User().delete_user()
    print(User.all())
    print(User.by_id(1))
    print(User.by_name("lethe"))
    print(User.by_name("kuku"))

database_connect.py

from sqlalchemy import create_engine

HOSTNAME = "127.0.0.1"  # 指的是linux的ip 因为代码运行在linux上
POST = "3306"  # 直接在linux上连接数据库不需要端口转发
DATABASE = "mydb_test"
USERNAME = "admin"  # 登录的用户
PASSWORD = "Root110qwe"

db_url = "mysql+pymysql://{}:{}@{}:{}/{}".format(
    USERNAME,
    PASSWORD,
    HOSTNAME,
    POST,
    DATABASE
)  # +号两边不能加空格  这里出现了点问题 将这个字符串重新写过后就可以了

engine = create_engine(db_url)  # 创建引擎

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base(engine)
# print(result.fetchone())


from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
session = Session()

user_module.py

from datetime import datetime
from sqlalchemy import Column, Integer, String, DateTime, Boolean
from database_connect import Base, session  # 模块名灰色代表还没有被调用


class User(Base):  # 继承Base这个引擎 新建表
    __tablename__ = "user"  # 表名
    id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(20), nullable=False)
    password = Column(String(50))
    email = Column(String(50))
    phone_number = Column(String(20))
    id_card = Column(String(30))
    createtime = Column(DateTime, default=datetime.now)
    _locked = Column(Boolean, default=False, nullable=True)

    @classmethod
    def all(cls):  # 类方法
        return session.query(cls).all()

    @classmethod
    def by_id(cls, id):
        return session.query(cls).filter_by(id=id).all()

    @classmethod
    def by_name(cls, name):
        return session.query(cls).filter_by(username=name).all()

    @property
    def locked(self):
        return self._locked

    def __repr__(self):
        return "" % (
                self.id,
                self.username,
                self.password,
                self.email,
                self.phone_number,
                self.id_card,
                self.createtime,
                self._locked
        )

    def add_user(self):
        # 添加单个对象
        # person = User(username="lethe",password="212121")
        # session.add(person)

        # 添加多个对象
        session.add_all([User(username="banban", password="1212120"),
                         User(username="kuku", password="32321")])
        # 提交才会生效,和命令行有区别
        session.commit()

    def search_user(self):
        # row = session.query(User).all()
        # print(row)
        row = session.query(User).filter_by(id=1).all()
        print(row)
        row = session.query(User).filter(User.username == "banban").all()
        print(row)
        print(row[0].locked)

    def update_user():
        row = session.query(User).filter_by(username="lethe").update({User.password: "1010101"})
        session.commit()


    def delete_user():
        row = session.query(User).filter_by(username="banban")[0]  # first
        print(row)
        session.delete(row)
        session.commit()

将上面的这些程序放在同一目录下 然后运行start.py


再去ubuntu里面的mysql看一下这张表



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44662.html

相关文章

  • 后端API从入门到放弃指北

    摘要:菜鸟教程框架中文手册入门目标使用搭建通过对数据增删查改没了纯粹占行用的拜 后端API入门学习指北 了解一下一下概念. RESTful API标准] 所有的API都遵循[RESTful API标准]. 建议大家都简单了解一下HTTP协议和RESTful API相关资料. 阮一峰:理解RESTful架构 阮一峰:RESTful API 设计指南 RESTful API指南 依赖注入 D...

    Jeffrrey 评论0 收藏0
  • 后端API从入门到放弃指北

    摘要:菜鸟教程框架中文手册入门目标使用搭建通过对数据增删查改没了纯粹占行用的拜 后端API入门学习指北 了解一下一下概念. RESTful API标准] 所有的API都遵循[RESTful API标准]. 建议大家都简单了解一下HTTP协议和RESTful API相关资料. 阮一峰:理解RESTful架构 阮一峰:RESTful API 设计指南 RESTful API指南 依赖注入 D...

    sf190404 评论0 收藏0
  • 后端API从入门到放弃指北

    摘要:菜鸟教程框架中文手册入门目标使用搭建通过对数据增删查改没了纯粹占行用的拜 后端API入门学习指北 了解一下一下概念. RESTful API标准] 所有的API都遵循[RESTful API标准]. 建议大家都简单了解一下HTTP协议和RESTful API相关资料. 阮一峰:理解RESTful架构 阮一峰:RESTful API 设计指南 RESTful API指南 依赖注入 D...

    Airmusic 评论0 收藏0

发表评论

0条评论

荆兆峰

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<