使用SQLite
一、关于 SQLite
- SQLite是一种嵌入式数据库,它的数据库就是一个文件
- SQLite本身是C写的,而且体积很小,经常被集成到各种应用程序中
- Python就内置了SQLite3,所以可以直接使用,无需单独安装,也不需要专门的数据库驱动
二、使用 SQLite
1、使用前须知
- 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection
- 连接到数据库后,需要打开游标Cursor,通过Cursor执行SQL语句获得执行结果
2、使用细节
>>> import sqlite3
>>> conn= sqlite3.connect('test.db')
>>> cursor = conn.cursor()
>>> cursor.execute('create table user_test(id varchar(20) primary key,name varchar(20))')
<sqlite3.Cursor object at 0x000000000294C2D0>
>>> cursor.execute('insert into user_test values (\'1\',\'allen\')')
<sqlite3.Cursor object at 0x000000000294C2D0>
>>> cursor.rowcount
1
>>> cursor.execute('select * from user_test')
<sqlite3.Cursor object at 0x000000000294C2D0>
>>> cursor.fetchall()
[('1', 'allen')]
>>> cursor.execute('select * from user_test where id=?', ('1',))
<sqlite3.Cursor object at 0x000000000294C2D0>
>>> cursor.fetchall()
[('1', 'allen')]
>>> cursor.close()
>>> conn.commit()
>>> conn.close()
使用Mysql
一、安装配置
- mysql 的安装配置(略)
- mysql 驱动安装(windows),直接cmd里面运行
pip install mysql-connector-python
- 使用还要检查一下 mysql 的数据引擎和编码
show variables like '%char%';
show variables like '%engine%';
二、使用示例
- 基本和 sqlite 是一样的,就是需要导入驱动而已
>>> import mysql.connector
>>> conn = mysql.connector.connect(user='root',password='root',database='test')
>>> cursor = conn.cursor()
>>> cursor.execute('create table user (id varchar(20) primary key, name varchar(
20))')
>>> cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael
'])
>>> cursor.rowcount
1
>>> conn.commit()
>>> cursor.close()
True
>>> cursor = conn.cursor()
>>> cursor.execute('select * from user where id = %s',('1',))
>>> cursor.fetchall()
[('1', 'Michael')]
>>> cursor.close()
True
>>> conn.close()
使用SQLAlchemy
- SQLAlchemy 就是一个ORM框架
- ORM技术就是把关系数据库的表结构映射到对象上
- 使用前先安装:
pip install sqlalchemy
1、基本使用
- 基本来说就是把以前用sql在数据库中进行数据的操作转换为了对相应的对象的操作
- declarative_base 是生成一个数据库表对应类型的基类
- sessionmaker 方法和 engine 绑定生成一个会话对应的类
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
base = declarative_base()
class User(base):
__tablename__ = 'user'
id = Column(String(20), primary_key=True)
name = Column(String(20))
engine = create_engine('mysql+mysqlconnector://root:root@localhost:3306/test')
Session = sessionmaker(bind=engine)
################# 数据的插入 #####################
# session = Session()
# user1 = User(id='12', name="stan")
# session.add(user1)
# session.commit()
# session.close()
################# 数据的查询 #####################
session = Session()
user = session.query(User).filter(User.id == '12').one()
print(type(user))
print(user.name)
session.close()
2、多表关联
- 这里面用户和书是一对多的关系,多方建立外键指向一方的主键
- 两个表的创建脚本如下
CREATE TABLE `book` (
`id` varchar(20) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`user_id` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_uid` (`user_id`),
CONSTRAINT `fk_uid` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
CREATE TABLE `user` (
`id` varchar(20) NOT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
- python测试代码如下
from sqlalchemy import Column, String, create_engine, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
base = declarative_base()
class User(base):
__tablename__ = 'user'
id = Column(String(20), primary_key=True)
name = Column(String(20))
books = relationship('Book')
class Book(base):
__tablename__ = 'book'
id = Column(String(20), primary_key=True)
name = Column(String(20))
user_id = Column(String(20), ForeignKey('user.id'))
engine = create_engine('mysql+mysqlconnector://root:root@localhost:3306/test')
Session = sessionmaker(bind=engine)
session = Session()
user2 = session.query(User).filter(User.id == '12').one()
print(user2.name)
for book in user2.books:
print(book.name)
session.close()
操作sqlserver
import pymssql
import config
server = server1
user = user1
password = password1
conn = pymssql.connect(server, user, password, database1) #获取连接
cursor = conn.cursor() # 获取光标
####创建表
cursor.execute("""
IF OBJECT_ID('persons', 'U') IS NOT NULL
DROP TABLE persons
CREATE TABLE persons (
id INT NOT NULL,
name VARCHAR(100),
salesrep VARCHAR(100),
PRIMARY KEY(id)
)
""")
####批量插入数据
cursor.executemany(
"INSERT INTO persons VALUES (%d, %s, %s)",
[(1, 'John Smith', 'John Doe'),
(2, 'Jane Doe', 'Joe Dog'),
(3, 'Mike T.', 'Sarah H.')])
conn.commit()
####删除数据
cursor.execute(
"delete from persons where id=2"
)
conn.commit()
# 查询数据并遍历,结果默认存放到元组之中,要存到字典,需修改cursor = conn.cursor(as_dict=True)
cursor.execute('SELECT * FROM persons WHERE id={0}'.format(3))
row = cursor.fetchone()
while row:
print(row)
row = cursor.fetchone()
####更改数据
cursor.execute(
"update persons set name ='haha' where id=1"
)
conn.commit()
####创建存储过程
cursor.execute("""
CREATE PROCEDURE FindPerson
@name VARCHAR(100)
AS BEGIN
SELECT * FROM persons WHERE name = @name
END
""")
#####调用存储过程
cursor.callproc('FindPerson', ('haha',))
for row in cursor:
print(row)
####执行含聚合函数的语句
cursor.execute('SELECT COUNT(*) FROM persons')
for row in cursor:
print(row[0])
conn.close()#手动关闭连接
#####用with实现自动关闭conn
with pymssql.connect("", "", "", "") as conn:
with conn.cursor(as_dict=True) as cursor: # 数据存放到字典中
cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
for row in cursor:
print(row)