数据库分类
- SQL(关系型数据库)
- MySQL
- Oracle
- SQL Server
- DB2
- NoSQL
这个 NoSQL 表示是 Not Only SQL, 而不是 No SQL.SQL 的本质是保证事物的完整性 (高并发的情况下) 遵循 ACID?, 无法水平扩展. 因而 NoSQL 基于 CAP, 在牺牲事物 (有可能丢失) 的情况下实行水平扩展,
- MongoDB
- Neo4j
- HBase
MySQL 的简单操作
使用 Navicat 来创建表
使用 Python 来操作 SQL
首先使用开发包, 主要有三种 MySQL-connector,MySQLdb,SQLAlchemy. 其中相比 MySQL-connector,MySQLdb 用的比较多. 而第一个则是官方给出的方案.
安装方案如下:
- pip3 install MySQL-connector #安装 MySQL-connector
- pip3 install PyMySQL #安装 MySQLdb 3.x 以上的替代方案
MySQL-connector 实操
创建链接
- from MySQL import connector
- conn = connector.connect(host = 'localhost', port = 3306 ,
- user = 'root', password = 'laoduan2008',
- charset = 'utf8')
- conn.autocommit = True #为了不重复输入 commit
- ERROR Record:
- MySQL.connector.errors.NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported
MySQL8 在这里和低版本不兼容, 你可以重新安装 MySQL(或者用 Reconfigure 选项), 把认证的选项设置为 "Use Legacy Authentication Method", 或者你如果不是必须要用 MySQL 8, 可以降级到低版本.
创建游标
- cursor = conn.cursor()
- sqltext = 'insert into users(name, address, email) values ("deamov","beijing","abc@blabla")'
- # 设置语句
- text_temple = 'insert into users(name, address, email) values (%s ,%s ,%s)'
- cursor.executemany(sql_template,userinfo)
- # 如何执行多条语句
执行 SQL
- cursor.execute(sqltext)
- # 执行语句
关闭连接
- cursor.close()
- conn.close()
- PyMySQL
创建链接
- import pymysql
- conn = pymysql.connect()
- conn.autocommit(True)
- ERROR Record
- pymysql.err.OperationalError: (1045, "Access denied for user'root'@'localhost'(using password: NO)")
有可能是 root 账号的密码这些不能登陆, 通过 root 账号登陆后, 分配一个账号类似
CREATE USER 'deamov'@'localhost IDENTIFIED WITH mysql_native_password BY'password';
. 之后,
use your_database_name
选择了你要用的数据库后, 将权限给你的新的账户
- grant all privileges on *.* to deamov@localhost
- .
创建游标
- cursor = conn.cursor()
- #MySQL-connector 用的是弱引用
- #PyMySQL 的游标可以在函数里用
执行 SQL
- sqltext = 'select * from users'
- cursor.excute(sqltext)
- for row in cursor:
- print row
- # 读取所有的
- for row in cursor.fetchmany(2):
- print row
- # 读取两条
- from faker import Factory
- userfaker = Factory.create()
- userinfo = [(userfaker.name(),userfaker.address(),userfaker.email()) for i in range(10)]
- text_temple = 'insert into users(name, address, email) values (%s ,%s ,%s)
- cursor.executemany(sql_template,userinfo)
- # 批量插入
关闭链接
- cursor.close()
- conn.close()
- SQLAlchemy
The Python SQL Toolkit and Object Relational Mapper.
ORM(O 是面向对象, R 是面向关系, M 是 Map):
面向对象和面向关系的模拟关联.
表映射到类
行映射到对象
列映射到属性
优点如下
隐藏数据库实现
良好的数据库操作接口, 简单, 学习成本低.
动态数据表映射
开发步骤
创建链接
- from sqlalchemy import create_engine
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy import Column,Integer,String,DateTime,ForeignKey
- engine = create_engine('mysql+mysqldb://deamov:password@127.0.0.1:3306/MySQLTest?charset=utf8',echo=True)
- #echo 这个参数是把 sql 的语句打印出来
创建映射(表的设计)
- Base = declarative_base()
- class User(Base):
- __tablename__ = 'users'
- id = Column(Integer, primary_key = Ture)
- name = Column(String(40))
- orders = relationship('Order')
- class Product(Base):
- __tablename__ = 'products'
- id = Column(Integer, primary_key = Ture)
- name = Column(String(40))
- orders = relationship('Order')
- #这个 orders 不是 ddl 语言, 而是针对面向对象编程而言的
- class Order(Base):
- __tablename__ = 'orders'
- id = Column(Integer,primary_key = True)
- otime = Column(DateTime)
- uid = Column(Integer, ForeignKey('users.id'))
- pid = Column(Integer, ForeignKey('products.id'))
- #定义外键
初始化映射实例
Base.metadata.create_all(engine)
创建会话
- Session = sessionmaker(engine)
- session = Session()
持久化对象实例
- DeamoV = User(name = 'DeamoV')
- session.add(DeamoV)
- p1 = Product(name = 'p1')
- session.add(p1)
- session.commit()
- '''
- ------
- '''#DeamoV = session.query(User).filter(User.name=='DeamoV')
- # 返回的是一个集合, 集合里是选择的实例类
- #p1 = session.query(Product).filter(Product.name=='p1')
- # 这里的 Product 和 User 都是类的名字
- o1 = Order(uid=p1.id ,pid=p1.id)
- # 添加了一个关系
- session.add(o1)
- orders=DeamoV.orders
- # 这个时候获取这个关系, 目前只有一个关系
- for order in orders:
- print(order.id)
来源: http://www.linuxidc.com/Linux/2019-01/156545.htm