scrapy学习之路4.1(SQLAlchemy的使用)(未完)

sqlalchemy是Python编程语言下的一款ORM框架,该框架创建在数据库API之上,使用关系对象映射进行数据库操做,简言之即是:将对象转换成SQL,而后使用数据API执行SQL并获取执行结果。python

clipboard.png

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就是把数据库表的行与相应的对象创建关联,互相转换。 因为关系数据库的多个表还能够用外键实现一对多、多对多等关联,相应地, ORM框架也能够提供两个对象之间的一对多、多对多等功能。数据库

1.建立表

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'))
相关文章
相关标签/搜索