sqlalchemy是Python编程语言下的一款ORM框架,该框架创建在数据库API之上,使用关系对象映射进行数据库操做,简言之即是:将对象转换成SQL,而后使用数据API执行SQL并获取执行结果。python
SQLAlchemy自己没法操做数据库,其必须以pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不一样调用不一样的数据库API,从而实现对数据库的操做。mysql
MySQL-Python mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> pymysql mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] MySQL-Connector mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> cx_Oracle oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
使用 Engine/ConnectionPooling/Dialect 进行数据库操做,Engine使用ConnectionPooling链接数据库,而后再经过Dialect执行SQL语句。sql
#!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5) # 执行SQL # cur = engine.execute( # "INSERT INTO hosts (host, color_id) VALUES ('1.1.1.22', 3)" # ) # 新插入行自增ID # cur.lastrowid # 执行SQL # cur = engine.execute( # "INSERT INTO hosts (host, color_id) VALUES(%s, %s)",[('1.1.1.22', 3),('1.1.1.221', 3),] # ) # 执行SQL # cur = engine.execute( # "INSERT INTO hosts (host, color_id) VALUES (%(host)s, %(color_id)s)", # host='1.1.1.99', color_id=3 # ) # 执行SQL # cur = engine.execute('select * from hosts') # 获取第一行数据 # cur.fetchone() # 获取第n行数据 # cur.fetchmany(3) # 获取全部数据 # cur.fetchall()
ORM框架的做用就是把数据库表的一行记录与一个对象互相作自动转换。 正确使用ORM的前提是了解关系数据库的原理。 ORM就是把数据库表的行与相应的对象创建关联,互相转换。 因为关系数据库的多个表还能够用外键实现一对多、多对多等关联,相应地, ORM框架也能够提供两个对象之间的一对多、多对多等功能。数据库
create_engine方法参数('使用数据库+数据库连接模块://数据库用户名:密码@ip地址:端口/要链接的数据库名称?charset=utf8',echo=True表示是否查看生成的sql语句,max_overflow=5) max_overflow=5 表示最大链接数 declarative_base()建立一个SQLORM基类 Column()设置字段属性 create_all()向数据库建立指定表 建立表数据类型 整数型:TINYINT,SMALLINT,INT,BIGINT Boolean()对应TINYINT Integer()对应INT SMALLINT()对应SMALLINT BIGINT()对应BIGINT 浮点型:FLOAT,DOUBLE,DECIMAL(M,D) DECIMAL()对应DECIMAL Float()对应FLOAT REAL()对应DOUBLE 字符型:CHAR,VARCHAR String(40)对应VARCHAR CHAR()对应CHAR 日期型:DATETIME,DATE,TIMESTAMP DATETIME()对应DATETIME DATE()对应DATE TIMESTAMP()对应TIMESTAMP 备注型:TINYTEXT,TEXT, Text()对应TEXT UnicodeText(10)对应TINYTEXT ############################################################################## # -*- coding:utf-8 -*- import sqlalchemy from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine engine = create_engine("mysql+mysqlconnector://root:123456@127.0.0.1:3306/project_db", echo=True) Base = declarative_base() class People(Base): __tablename__ = "people" # 表名 id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(16), nullable=False) age = Column(Integer, nullable=False) job = Column(String(16), nullable=False) salary = Column(Integer, nullable=False) Base.metadata.create_all(engine) # 新建表 # Base.metadata.drop_all(engine) # 删除表
primary_key=True主键索引
autoincrement=True自增字段
index=True给当前字段建立普通索引
unique=True给当前字段建立惟一索引
UniqueConstraint('字段','字段',name='索引名称')建立惟一组合索引
Index('索引名称','字段','字段')建立普通组合索引
default='abc'设置字段默认值,不怎么可靠
ForeignKey("链接表名称.链接表主键字段")设置外键链表
nullable=False类容不能为空编程
# -*- coding:utf-8 -*- import sqlalchemy from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine engine = create_engine("mysql+mysqlconnector://root:123456@127.0.0.1:3306/project_db", echo=True) Base = declarative_base() class People(Base): __tablename__ = "people" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(16), nullable=False) age = Column(Integer, nullable=False) job = Column(String(16), nullable=False) salary = Column(Integer, nullable=False) books = relationship('book') # 这里的book为小写 class Book(Base): __tablename__ = "book" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(16), nullable=False) author = Column(String(16), nullable=False) people_id = Column(Integer, ForeignKey('people.id')) # 这里的people为小写 Base.metadata.create_all(engine) # 新建表 #Base.metadata.drop_all(engine) # 删除表
class Server(Base): __tablename__ = "server" id = Column(Integer, primary_key=True, autoincrement=True) hostname = Column(String(8)) class Group(Base): __tablename__ = "group" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(16), unique=True) class ServertoGroup(Base): __tablename__ = "servertogroup" id = Column(Integer, primary_key=True, autoincrement=True) server_id = Column(Integer, ForeignKey('server.id')) group_id = Column(Integer, ForeignKey('group.id'))