数据库分类
SQL(关系型数据库) MySQL
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)