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

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

SQLAlchemy本身无法操作数据库,其必须以pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作。

MySQL-Python
    mysql+mysqldb://:@[:]/
  
pymysql
    mysql+pymysql://:@/[?]
  
MySQL-Connector
    mysql+mysqlconnector://:@[:]/
  
cx_Oracle
    oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

底层处理

使用 Engine/ConnectionPooling/Dialect 进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy import create_engine
 
 
engine = create_engine("mysql+pymysql://root:[email protected]: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:[email protected]: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:[email protected]: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'))

你可能感兴趣的:(scrapy,python)