SQLAlchemy连接数据库
在用到python的一些框架里,需要进行前后端数据交互,其中数据库的连接是必不可少的,之前自己使用SQLAlchemy在进行数据库连接时遇到了很多问题,以及一些流程不是很清楚。所以花了点时间进行了一下流程梳理。
1.首先建立一个空py文件(这里命名为connect.py),导入包:
from sqlalchemy import create_engine
接下来设定连接数据库(以MySQL为例)所需要的信息,包括用户名、密码、端口号、IP以及要使用的数据库名字等信息,例如:
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'mydb'
USERNAME = 'root'
PASSWORD = '123456'
然后设置一个字符串的格式:
db_url='mysql+pymysql://{}:{}@{}/{}?charset=utf8'.format(
USERNAME,
PASSWORD,
HOSTNAME,
DATABASE
)
创建一个引擎:
engine = create_engine(db_url)
将引擎作为参数导入declarative_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__':
print(dir(Base))
print(dir(session))
2.新建一个py文件(这里命名为user_modules.py),用来创建一个user表单。
首先从SQLAlchemy导入创建数据库记录的格式,同时将上个connect.py文件里创建的Base和session导入进来,下面也需要用到datetime的模块,将其也导入进来:
from datetime import datetime
from connect import Base,session
from sqlalchemy import Column,Integer,String,DateTime,Boolean
然后定义一个User类,继承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)
_locked = Column(Boolean,default=False,nullable=False)
# 自己封装查询方法
@classmethod
def get_all(cls):
return session.query(cls).all()
@classmethod
def get_id(cls,id):
return session.query(cls).filter_by(id=id).all()
@classmethod
def get_username(cls,username):
return session.query(cls).filter_by(username=username).all()
@property
def locked(self):
return self._locked
def __repr__(self):
return "
self.id,
self.username,
self.password,
self.creatime,
self._locked
)
最后再执行创建:
if __name__=='__main__':
Base.metadata.create_all()
可以登录数据库查看一下user表是否被创建出来。
3.最后再创建一个py文件(这里命名为test_user.py),用来测试对user表的“增删改查”:
from user_modules import User
from connect import session
#增
def add_user():
# person = User(username='suyn',password='123456')
# session.add(person)
session.add_all([User(username='der',password='asdfas'),User(username='sa',password='mima99')])
session.commit()
#删
def delete_user():
row = session.query(User).filter_by(username='der')[0]
print(row)
session.delete(row)
session.commit()
#改
def update_user():
session.query(User).filter_by(id=3).update({User.password:'abcdefg'})
session.commit()
#查
def query_user():
row = session.query(User).filter_by(username='suyn').all()
row = session.query(User).filter(User.username=='suyn').all()
print(row[0]._locked)
session.commit()
最后可以进行验证:
if __name__=='__main__':
# 验证
# add_user()
# delete_user()
# update_user()
# query_user()
①初始化数据库连接,默认创建一个Book表
# coding=utf-8
from sqlalchemy import Column, create_engine, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 初始化数据库连接:
engine = create_engine('mysql+mysqlconnector://root:root@localhost:3306/dbName?charset=utf8',
encoding="utf-8",
echo=True)
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)
# 生成orm基类
Base = declarative_base()
class Book(Base):
__tablename__ = 'book'
id = Column(Integer, primary_key=True)
book_name = Column(String(200))
author = Column(String(200))
Base.metadata.create_all(engine)
②定义一个BaseHandle用来操作数据库
# coding=utf-8
import tornado.web
from db import DBSession
class Base_handle(tornado.web.RequestHandler):
def initialize(self):
self.db = DBSession()
③一个简单的restful风格的web小程序,这里就不多说了。。。
# coding=utf-8
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import os.path
from tornado.options import define, options
from baseHandle import Base_handle
from db import Book
define("port", default=8000, help="run on the given port", type=int)
class MainHandler(Base_handle):
def get(self, book_name):
books = self.db.query(Book).filter(Book.book_name == book_name).all()
self.render("book.html", books=books)
def post(self, book_name):
self.get(book_name)
class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r"/book/([0-9a-zA-Z\-\_]+)", MainHandler),
]
settings = dict(
cookie_secret="43oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
login_url="/login",
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
xsrf_cookies=True,
)
tornado.web.Application.__init__(self, handlers, **settings)
def main():
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(Application())
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()
④页面代码。。。没啥代码。。。
Tornado Book Demo
编号
书本名称
书本作者
{% for bk in books %}
{
{bk.id}}
{
{bk.book_name}}
{
{bk.author}}
{% end %}
⑤项目的结构
⑥数据库数据
之后就可以通过页面访问这个web接口了: