1

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://<username>:<password>@<host>/<dbname>?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的图形化数据库工具

设置步骤:

  1. 点击view-->点击Toll Windows -->点击database
  2. 在在pycharm右侧找到database,点开它
  3. 点+号-->Data Source--> 选择mysql(我这里是用的mysql,其他数据库也行)
  4. 按要求填写对应的项-->点击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 "<User(id='%s', " \
               "username='%s', " \
               "password='%s', " \
               "email='%s', " \
               "phone_number='%s', " \
               "id_card='%s', " \
               "createtime='%s', " \
               "_locked='%s'\n)>" % (
                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看一下这张表


图片描述



lethe
44 声望7 粉丝