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 "
"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看一下这张表