一、ORM
ORM全称Object Relational Mapping(对象关系映射)。通过ORM可以不关心后台使用的哪种数据库,只需按照ORM所提供的语法规则去书写相应的代码,ORM就会自动的转换成对应数据库的语句。
SQLAlchemy是pychon中常用的ORM,本章以SQLAlchemy为例。
二、SQLAlchemy连接数据库
1.安装
linux上安装mysql、python包:pymysql、sqlalchemy.
pip安装python包:pip install pymsql
pip install sqlalchemy
直接安装比较慢,可以使用国内的源下载安装
pip install -i https://pypi.douban.com/simple pymsql
pip install -i https://pypi.douban.com/simple sqlalchemy
2.导入模块
from sqlalchemy import create_engine
3.数据库数据
HOSTNAME = '192.168.1.104' #服务器ip注意桥接模式和端口转发模式的区别
PORT = '3306'
DATABASE = 'mydb'
USERNAME = 'admin'
PASSWORD = 'Root110qwe'
4.格式化数据库连接url
db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(
USERNAME,
PASSWORD,
HOSTNAME,
PORT,
DATABASE
)
5.连接数据库
engine = create_engine(db_url)
6.测试连接
if __name__ = '__main__':
connection = engine.connect()
result = connection.execute('select 1')
print(result.fetchone())
运行后,控制台打印以下结果,表示连接成功
在linux服务器上查询数据库用户信息,显示
host中%表示允许全部连接方式(本地连接和远程连接);localhost表示只允许本地连接
三、Module
使用SQLAlchemy连上数据库之后,接下来我们就在数据库里面新建表。
对象关系映射,数据库中的表与python中的类对应,必须要创建一个继承自sqlalchemy的基类。
1.第一步:创建 Module 的 Base 类
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base(engine)
使用declarative方法定义的映射类依据一个基类,这个类是维系类和数据表关系的目录。
应用通常只需要有一个Base的实例。我们通过declarative base()来创建一个基类。
2.第二步:创建表模型Module
from datetime import datetime
from sqlalchemy import Column, Integer, String, DateTime
from connect import Base
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(20), nullable=False)
password = Column(String(50))
creatime = Column(DateTime, default=datetime.now)
对象关系映射在这里就是指把数据库的表映射为一个类。
我们用类来表示数据库里面的表,这些表的类都继承于我们的Base基类。在类里我们定义的属性,通过映射,对应表里面的字段。
3.第三步:通过主函数调用来创建Module
Base.metadata.create_all()
运行后可以看到创建了新表user
四、增删改查
1.创建会话
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
session = Session()
在对数据库表进行操作之前,要先建立会话,建立会话之后才能进行操作,就类似于文件要打开之后才能对文件进行内容操作
2.导入session和module
from connect import session
from user_module import User
3.写增删改查
先以简单的增删改查为例
添加一条数据和添加N条数据,注意,改变数据库表内容时候要session.commit()提交
person = User(username = 'wjl', password = 'qwe123')
session.add(person)
session.add_all(
[
User(username = 'lgj', password = 'aaa'),
User(username = 'gy', password = 'bbb')
]
)
session.commit()
查询第一条数据和查询所有数据
rows = session.query(User).all()
rows = session.query(User).first()
更新数据
#filter相当于where,条件
session.query(User).filter(User.id==1).update({User.password:123})
session.commit()
删除数据
rows = session.query(User).filter(User.id==2)[0]
session.delete(rows)
session.commit()
注意:
以上语句中 session.query(User).filter(User.id==2)
session.query(User)
打印显示为sql语句
SELECT user.id AS user_id, user.username AS user_username, user.password AS user_password, user.creatime AS user_creatime
FROM user
WHERE user.id = %(id_1)s
SELECT user.id AS user_id, user.username AS user_username, user.password AS user_password, user.creatime AS user_creatime
FROM user
以下为本文示例代码
Module基类:user_module.py
from datetime import datetime from sqlalchemy import Column, Integer, String, DateTime from connect import Base class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String(20), nullable=False) password = Column(String(50)) creatime = Column(DateTime, default=datetime.now) def __repr__(self): return '<User(id=%s, username=%s, password=%s, creatime=%s)>' % ( self.id, self.username, self.password, self.creatime ) if __name__ == '__main__': Base.metadata.create_all()
连接数据库类:connect.py
from sqlalchemy import create_engine HOSTNAME = '192.168.1.104' PORT = '3306' DATABASE = 'mydb' USERNAME = 'admin' PASSWORD = 'Root110qwe' db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format( USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE ) engine = create_engine(db_url) #创建Module的基类Base from sqlalchemy.ext.declarative import declarative_base Base = declarative_base(engine) #要进行数据库操作,先要创建会话 from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine) session = Session() if __name__ == '__main__': connection = engine.connect() result = connection.execute('select 1') print(result.fetchone())
数据库操作类:test_module.py
from connect import session from user_module import User def add_user(): person = User(username = 'wjl', password = 'qwe123') session.add(person) session.add_all( [ User(username = 'lgj', password = 'aaa'), User(username = 'gy', password = 'bbb') ] ) session.commit() def search_user(): rows = session.query(User).all() print(rows); rows = session.query(User).first() print(rows); def update_user(): #filter相当于where,条件 session.query(User).filter(User.id==1).update({User.password:123}) session.commit() def delete_user(): rows = session.query(User).filter(User.id==2)[0] session.delete(rows) session.commit() print(rows) if __name__ == '__main__': # add_user() search_user() update_user() delete_user()
由此实现对数据库简单的增删改查