您的位置:首页 > 数据库 > Mongodb

Python连接MySQL、Mongodb、SQLite

2020-08-10 17:20 555 查看

存储方式不同

关系型数据库:以文件方式永久存储到磁盘,如MySQL
非关系型数据库:存储在内存,访问速度很快,通常用来做队列,缓存之类的服务,如Mongodb

SQLAlchemy(是一款ORM具体实现的库)

定义:SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具。兼容众多数据库(如 SQLite、MySQL、Postgres、Oracle、MS-SQL、SQLServer 和 Firebird)的企业级持久性模型,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型。–百度百科

作用:高效访问数据库且支持跨数据库使用(不用因为更换了数据库而需要重新编写SQL)

ORM概念

定义:Object-Relational Mapping,对象与关系型数据库映射关系
目的:通过ORM操作数据库,并不需要通过数据库的SQL语言进行,只要对python的数据对象执行相关方法即可,比如添加一条记录,user.add()

SQL和ORM比较:

ORM优势
ORM对SQL操作进行了封装
1、更换数据库只要更换数据库源,代码无需改动
2、对数据库操作转为对python对象(Model)的操作
3、安全性更高

SQL劣势
1、SQL语句可能会随着厂商不同而有所差异
2、封装性不够,重复代码多,而不够优雅
3、安全性不够,可能会有注入漏洞

连接SQLite(基于flask框架示例)

1、SQLAlchemy-1.3.3.tar.gz安装

pin install SQLAlchemy-1.3.3.tar.gz

2、sqlite-web-0.3.6.tar.gz安装

pip install Flask_SQLAlchemy-2.4.1-py2.py3-none-any.whl

3、app.py里面导入from flask_sqlalchemy import SQLAlchemy

4、数据库信息配置,如数据库名称等

#配置数据库
#变更后是否追踪,这里默认为True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
#cms.db为数据库名字
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///cms.db"

5、数据库实例化

#实例化数据库名称为db
db = SQLAlchemy(app)

6、创建数据库Model模型,继承db.Model

#创建数据库Model结构
class User(db.Model):
#db.Column()为创建字段,第一个参数为字段数据类型
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String)
password = db.Column(db.String)
sex = db.Column(db.String)
age = db.Column(db.Integer)
>>> from app import db
>>> db.create_all()#执行后通过sqlite-web界面可以看到有更新数据模型

7、实例化模型对象,用来添加记录用

#实例化用户
user = User(
username=username,
password=password,
sex=sex,
age=age
)

8、借助db.session对象用来与数据库交互(如写入记录,确认等)

db.session.add(user)#将用户添加到对话里面,还没提交数据库!
db.session.commit()#确认提交

9、创建数据库

#flask shell
#先进入shell命令行
from app import db
#从app.py文件中导入db数据库对象
db.create_all()
#用db对象创建一个数据表,路径及文件名参考app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///cms.db"

连接Mongodb

前提:电脑确认已经开启了mongodb服务

import pymongo
#创建MongoDB 的连接对象
client = pymongo.MongoClient(host='localhost', port=27017)
#指定要使用的数据库
db = client.test
#指定数据库中要使用的集合
collection = db.commodity12

student = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}

result = collection.insert_one(student)
print(result)
print(result.inserted_id)
#执行完输出
<pymongo.results.InsertOneResult object at 0x000001DD8C6FBA88>
5f30f92f31e3295b39e20cef

连接上Mongodb,刷新,查看test.commodity12下,可以发现已经新增了一条json

连接MySQL

import mysql.connector as connector

#数据库连接对象
cnx = connector.connect(user='root', password='123456',
host='localhost', database='mydb')

#游标,通过游标对象执行sql语句
cursor = cnx.cursor()

def createUser(user):
words = list("abcdefghijklmnopqrstuvwxyz")
sql = "insert into `users`" \
"(username,realname,passwd,sex)" \
"values" \
"('{username}','{realname}','{passwd}','{sex}')"
sql = sql.format(**user)
res = None
print(sql)

#通过异常执行
try:
# 执行sql语句
cursor.execute(sql)
cnx.commit()  # 创建表时加不加这一句都不影响
print(dir(cursor))
res = cursor.lastrowid
except Exception as e:
# print(sql)
print(e)
else:
print("数据表插入成功")
return res

# # 关闭游标
#     # cursor.close()
#     #
#     # # 关闭连接
#     # cnx.close()

user = {
'username': 'ameng0810',
'realname': 'mynicknamemeng',
'passwd': '123456789',
'sex': '女'
}

res = createUser(user)
print("数据插入结果:", res)
#输出
insert into `users`(username,realname,passwd,sex)values('ameng0810','mynicknamemeng','123456789','女')
['__abstractmethods__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', '_batch_insert', '_binary', '_connection', '_description', '_execute_iter', '_executed', '_executed_list', '_fetch_row', '_fetch_warnings', '_handle_eof', '_handle_noresultset', '_handle_result', '_handle_resultset', '_handle_warnings', '_have_unread_result', '_last_insert_id', '_nextrow', '_process_params', '_process_params_dict', '_raw', '_reset_result', '_rowcount', '_set_connection', '_stored_results', '_warning_count', '_warnings', 'arraysize', 'callproc', 'close', 'column_names', 'description', 'execute', 'executemany', 'fetchall', 'fetchmany', 'fetchone', 'fetchwarnings', 'getlastrowid', 'lastrowid', 'next', 'nextset', 'reset', 'rowcount', 'setinputsizes', 'setoutputsize', 'statement', 'stored_results', 'with_rows']
数据表插入成功
数据插入结果: 17

数据库查看:本地连接

连接成功后,进到mydb.users表,可以看到id为17的新增数据

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: