如何在python爬虫写入数据库中写数据库中的翻译

用 Keras 编写你的第一个人工神经网络(Python)—— Jinkey 翻译译者:Jinkey(微信公众号 jinkey-love)英文原版地址:教程概述这里不需要编写太多的代码,不过我们将一步步慢慢地告诉你怎么以后怎么创建自己的模型。教程将会涵盖以下步骤:加载数据定义模型编译模型训练模型评估模型结合所有步骤在一起这个教程的前置条件:有 python 2 或 3 的环境和编程基础安装并配置好 Scipy 库(包括 Numpy )你安装好 Keras 并且有一个后端( or )创建一个新的文件,命名为 keras_first_network.py ,然后将教程的代码一步步复制进去。1. 加载数据每当我们使用机器学习算法使用随机过程(如随机数),先设置随机数种子是一个好的习惯。这样您就可以运行相同的代码一次又一次,得到相同的结果。如果你需要证明结果,使用随机数据比较算法或调试代码,这是很有用的。你可以初始化随机数发生器及其种子,例如:from keras.models import Sequential
from keras.layers import Dense
import numpy
# fix random seed for reproducibility
numpy.random.seed(seed)
现在我们可以加载我们的数据了。在这个教程中,我们将使用.这是UCI 机器学习数据库一个标准的机器学习数据集。它描述了病人医疗记录和他们是否在五年内发病。因此,它是一个二分类问题(出现糖尿病为1, 否则为 0)。所有描述病人的输入变量都是数值。这便于直接用于需要数值输入输出的神经网络, 适合我们第一个 Keras 神经网络。下载数据集并且重命名为 pima-indians-diabetes.csv 放入 python 脚本所在的目录的 data/pima-indians-diabetes.csv。你可以只直接使用 Numpy 库的 loadtxt() 方法加载数据,一共 8 个输出变量和 1 个输出变量(最后一列)。加载之后我们就可以把数据分离为 X(输出变量)和 Y(输出分类)# load pima indians dataset
dataset = numpy.loadtxt("data/pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:, 0:8]
Y = dataset[:, 8]
我们已经初始化了我们对的随机数生成器来确保结果可复现, 也加载了数据。我们现在可以准备定义我们的神经网络模型了。2. 定义模型Keras 中的模型被定义为一系列的层。我们实例化一个 Sequential 模型对象,每次添加一层知道我们对网络的拓扑结构满意。第一件事情我们需要确保的是输出神经元的数量。这可以在模型创建的时候设置参数 input_dim 来定义,我们将这个参数设置为 8 对应 8 个输出变量。我们怎么知道层的数量和他们的类型呢?这是一个非常难回答的问题。这是启发式的,我们通过不断地试错找出最好的网络结构、一般来说,你需要足够大的网络去明白结构对于问题是否有用。在这个例子中, 我们使用三层全连接的结构。全连接层使用 Dense 定义。我们可以通过第一个参数定义层的神经元数量,第二个参数 init 定义权重的初始化方法, activation 参数定义激活函数。在这个例子中, 我们把权重初始化成一个服从均匀分布的小随机数(init='uniform'),在0到0.05直接(这是 Keras 标准均匀分布权重初始值)。另一种传统的选择是‘normal’,会从高斯分布(正态分布)中产生一个小的随机数。我们在前两层使用 (relu)[)] 激活函数, 在输出层使用 Sigmoid 函数。曾经 Sigmoid 和 tanh 激活函数是所有的层首选的。但时至今日, 使用 relu 激活函数可以达到更好的性能。我们在输出层使用 Sigmoid 函数来确保网络输出在 0 和 1 之间,我们可以添加每一层将这些东西放到一起。第一层有 12 个神经元、8个输出变量。第二层有 8 个神经元和最后 1 个神经元的输出层用于预测类别(糖尿病有无发病)# create model
model = Sequential()
model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
3. 编译模型现在我们定义好模型, 那么就可以编译他了。编译使用高效的数学库, 封装了 Theano 或者 TensorFlow(称为 backend)。后端(backend)在你的硬件上自动选择最好的方式去表现用于训练和预测的神经网络,比如 CPU、GPU 或者分布式。编译时, 我们需要额外定义训练网络所需要的参数。记住, 训练网络意味着寻找最优的权重集去预测。我们需要定义评估权重集的损失函数, 用于寻找不同权重的优化器以及我们希望在训练过程呈现的可选指标。在这个例子中, 我们使用对数损失函数(logarithmic loss), 对于二分类问题, 其在 Keras 中称为“binary_crossentropy”。我们还将使用梯度下降算法‘adam’, 没有为什么, 它就是一种高效地默认方法。想了解更多这种算法可以查看论文: (Adam: A Method for Stochastic Optimization)[]最后, 以为这是一个分类问题, 所以我们会收集和汇报分类的准确率作为度量指标。# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
4. 训练模型我们已经定义和编译了模型, 他是为高效地计算而准备的。现在是时候在数据上训练模型了。我们可以在加载的数据上训练和拟合模型,通过 fit() 函数。训练过程会在数据集迭代一定的次数,成为 epochs, 这个可以通过 nb_epoch 参数来设定。我们也可以设定 batch_size 参数来指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降, 使目标函数优化一步。在这个例子中, 我们将迭代150次、批处理大小为10。再说一次, 这些参数可以通过试错来选择。# Fit the model
model.fit(X, Y, nb_epoch=150, batch_size=10)
这就是在你的 CPU 或者 GPU 上发生的事情。5. 评估模型我们已经在整个数据集上训练了我们的神经网络, 我们可以在线通的数据集上评估神经网络的性能。这只会告诉我们模型有多适合已有的数据(训练的准确率),但我们无从知道算法在新数据上的性能。我们可以简单但很理想地把数据分为训练集和测试集来分别训练和评估模型。你可以通过 evaluate() 函数在训练集评估你的模型, 使用你训练模型时相同的输出和输出。这会针对每一个输出-输出产生预测并且收集分数,包括平均损失和其他我们定义的指标,比如准确率。# evaluate the model
scores = model.evaluate(X, Y)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
6. 将这些放在一起你已经看到用 Keras 创建你的第一个神经网络有多么简单、运行以上的代码, 将会看到150个迭代中, 每次迭代的损失和准确率,以及最终的模型在训练集上的评估结果, 在我的 CPU 上耗时 10s(使用 Theano 作为后端)...Epoch 143/150768/768 [==============================] - 0s - loss: 0.4614 - acc: 0.7878Epoch 144/150768/768 [==============================] - 0s - loss: 0.4508 - acc: 0.7969Epoch 145/150768/768 [==============================] - 0s - loss: 0.4580 - acc: 0.7747Epoch 146/150768/768 [==============================] - 0s - loss: 0.4627 - acc: 0.7812Epoch 147/150768/768 [==============================] - 0s - loss: 0.4531 - acc: 0.7943Epoch 148/150768/768 [==============================] - 0s - loss: 0.4656 - acc: 0.7734Epoch 149/150768/768 [==============================] - 0s - loss: 0.4566 - acc: 0.7839Epoch 150/150768/768 [==============================] - 0s - loss: 0.4593 - acc: 0.7839768/768 [==============================] - 0sacc: 79.56%如果你尝试在 IPython 或者 Jupyter , 你将会得到错误。原因是在训练期间输出进度条。你可以关闭这个, 通过让 model.fit() 的参数 verbose=0福利: 做出预测我被问得最多的一个问题是:在我训练模型之后, 怎么预测新数据的分类?这是个好问题。我们拟合了上述例子, 用他来在训练集上作出预测, 假装我们之前没看到过这些数据。做预测同样非常简单, 只需要使用 model.predict()。我们在输出层使用 Sigmoid 激活函数, 因此我们的预测值将会在 0 到 1 的区间内。在这个分类任务中,我们可以轻易地通过四舍五入转换为离散二分类。预测训练集中每一个记录的完整例子如下:# Create first network with Keras
from keras.models import Sequential
from keras.layers import Dense
import numpy
# fix random seed for reproducibility
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))
model.add(Dense(8, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, nb_epoch=150, batch_size=10,
verbose=2)
# calculate predictions
predictions = model.predict(X)
# round predictions
rounded = [round(x) for x in predictions]
print(rounded)
运行这个修改过的例子, 将会打印出每个输出的预测值。如果有需要的话, 我们可以直接使用这些预测。[1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]总结在这篇文章当中, 我们学会了如何通过 Keras 创建自己的第一个神经网络模型。特别是我们学会了 使用 Keras 来创建神经网络或深度学习模型时关键的 5 个步骤:加载数据定义模型编译模型训练模型评估模型有任何疑问欢迎关注我的公众号 jinkey-love 和我交流。82 条评论分享收藏本篇文章长期更新
本文翻译自:
如本文哪里有翻译不妥,请在本文下方评论处指出 ^_^
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处,作者信息。否则将追究法律责任。
这篇手册描述了怎么来安装和配置 MySQL Connector/Python,MySQL Connector/Python 是 Python 和 MySQL 服务进行通信的一个独立驱动程序,本篇手册还将阐述如何利用它来开发数据库应用程序。
获取 Connector/Python 的每一次发布版本的改动细节,请参阅 。
获取合法信息,请参阅 。
获取 MySQL 使用帮助,请访问
或者 ,在那里你可以和其他 MySQL 用户进行讨论交流 。
获取 MySQL 其他产品的文档,包括其他语言的翻译文档和可供下载各种格式的版本,这包括 HTML 和 PDF 格式,具体参看
关于许可信息的一些说明:MySQL 产品可能包含第三方软件,使用许可信息,如果你正在使用 MySQL Connector/Python 的商业发布版本,请点击
获取许可信息,里面包括了关于包含了商业发布版本的第三方软件的许可信息。。如果你正在使用 MySQL Connector/Python 的社区发布版本,请点击
获取许可信息,里面包括了关于包含了社区发布版本的第三方软件的许可信息。
文档生成日期:(修订代号:52416)
1 MySQL Connector/Python 介绍
MySQL Connector/Python 能够让你的 Python 程序和 MySQL 数据库进行通信,它使用了符合 规范的 API 。这个 API 除了
外其它的都是用纯 Python 写的并且没有任何依赖关系。
获取 Connector/Python 每个发布版本的详细改变,请参阅 。
MySQL Connector/Python 支持包括如下:
几乎所有的功能都由 MySQL Server(包括 MySQL Server 5.7 版本) 提供 。
Python 和 MySQL 两者的数据类型可以来回转换其对应的参数值,例如 Python 的 datetime 和 MySQL 的 DATETIME,为了方便起见,你可以选择自动转换,或者关闭最佳性能。
所有的 MySQL 扩展到了标准的 SQL 语法。
压缩协议能够在客户端和服务端之间进行对数据流的压缩。
使用 TCP/IP 套接字和在 Unix 上使用 Unix 套接字进行连接。
使用 SSL 连接可以使 TCP/IP 更安全。
在标准库外,独立的 Connector/Python 驱动不需要 MySQL 客户端库或者其他一些 Python 的模块。
获取每个 MySQL Connector/Python 版本能适用哪些 Python 版本的信息,请参阅 3 Connector/Python Versions
注:Connector/Python 不支持老版本的 MySQL Server 验证方法,这意味着 4.1 之前版本的 MySQL 不会工作
2 MySQL Connector/Python 开发者指南
下面这个涵盖了 MySQL 应用方面的指南对于一个有着 Python 开发背景的人员来说不会显得那么难:
3 Connector/Python 版本
下面这张表总结了可用的 Connector/Python 版本,对于一些待发布的正式版本来说,在它之前的开发版本就不再长久支持了。
Connector/Python 版本
MySQL Server 版本
Python 版本
Connector 状态
5.7、5.6、5.5
3.3 或更高、2.7
开发者里程碑
5.7、5.6、5.5
3.3 或更高、2.7、2.6
5.7、5.6、5.5
3.3 或更高、2.7、2.6
正式版,支持
5.7、5.6、5.5(5.1、5.0、4.1)
3.1 或更高、2.7、2.6
正式版,支持
注:众所周知,MySQL server 和 Python 版本两者要协同工作,那么必须要 Connector/Python 作为一个桥梁将两者连在一起
注:Connector/Python 不支持老版本的 MySQL Server 验证方法,这意味着 4.1 之前版本的 MySQL 不会工作
4 Connector/Python 安装
Connector/Python 能够在任何安装了 Python 的平台上运行,Unix 和 类 Unix 系统上都预装了 Python,比如 Linux,OS X 和 FreeBSD。在微软的操作系统中,你可以在
上下载 Python 安装包进行安装,如果有必要,请在您尝试安装 Connector/Python 之前先下载和安装 Python 。
注:Connector/Python 需要你的系统路径下有 Python,因为当 Python 没有被加载时,Connector/Python 会安装失败
4.1 获取 Connector/Python
4.2 Connector/Python 二进制文件安装
4.3 Connector/Python 源代码安装
4.4 验证 Connector/Python 是否安装成功
5 Connector/Python 代码例子
这些代码例子说明了如何使用 MySQL Connector/Python 来连接 MySQL Server 并开发出 Python 应用程序和脚本。
5.1 使用 Connector/Python 连接 MySQL
构造函数 connect() 创建了一个连接 MySQL 的服务并返回一个 MySQLConnection 对象。
下面这个例子展示了怎么来连接 MySQL server:
import mysql.connector
cnx = mysql.connector.connect(user='scott', password='tiger',
host='127.0.0.1',
database='employees')
cnx.close()
翻译未完 ......
阅读(...) 评论()如何写一个编程语言的翻译器,比如将python翻译成C或者lua翻译成C++? - 知乎108被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答03 条评论分享收藏感谢收起python使用百度翻译进行中翻英示例
这篇文章主要介绍了python使用百度翻译进行中翻英示例,需要的朋友可以参考下
利用百度词典进行中翻英
import urllib2
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def tran(word):
url='http://dict.baidu.com/s?wd={0}&tn=dict'.format(word)
req=urllib2.Request(url)
resp=urllib2.urlopen(req)
resphtml=resp.read()
text = re.search(r'explain: "(.*)"',resphtml)
return text.group(1).replace('&br /&',' ')
a=tran('word')#要翻译的词
ab = open('resault.txt','w')
ab.write(a)
ab.close()
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.039 (s). 13 q(s)声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用
上篇我们完成了数据库模型的代码,但是还只是python代码而已,我们还没有让django翻译成数据库语言。因此实际上这些table还没有创建
为了让django完成翻译,还需要使用manage.py。进入Terminal运行python manage.py makemigrations 和 python manage.py migrate
&可以看到,当我们执行了python manage.py makemigrations 后,django在blog应用的migrations目录下生成了一个0001.initial.py文件,这个文件是django用来记录我们对模型做了那些修改的文件,目前来说,我们在models.py里面建了三个模型类,django把这些变化记录在了0001.initial.py里,但此时只是告诉了django我们做了那些改变,为了让django真正为我们创建数据库表,接下来执行了python manage.py migrate命令,django通过检测应用中migrations目录下的文件,得知我们对数据库做了那些操作,然后把这些操作翻译成数据库语言,从而把这些操作应用于真正的数据库里,你可以看到命令的输出除了Applying blog 0001.initial...OK外,django还对其它文件做了操作,这是因为除了我们自己建立的blog应用外,django自己还内置了很多应用,这些引用自己也是需要数据的,可以再settings.py的INSTALLED_APP设置里看到这些应用
<span style="color: # INSTALLED_APPS = [
<span style="color: #
'django.contrib.admin',
<span style="color: #
'django.contrib.auth',
<span style="color: #
'django.contrib.contenttypes',
<span style="color: #
'django.contrib.sessions',
<span style="color: #
'django.contrib.messages',
<span style="color: #
'django.contrib.staticfiles',
<span style="color: #
<span style="color: # ]
你可以运行下面的命令查看django究竟为我们做了什么:python manage.py sqlmigrate blog 0001
这些数据库的SQL语言
使用django的方式从数据库里获取数据
数据库最主要的操作就是往里面存入数据,从中取出数据,修改已经保存的数据和删除不再需要的
数据,和创建数据库表一样django为这些操作提供了一整套方法,只要简单的调用几个python函数就可以满足我们的需求
在Terminal运行python manage.py shell进入一个交互式命令行
首先创建一个分类和一个标签
<span style="color: # from blog.models import Category, Post, Tag
<span style="color: # c = Category(name='category test')
<span style="color: # c.save()
<span style="color: # t = Tag(name='tag test')
<span style="color: # t.save()
首先导入了3个我们之前写好的模型类,然后实例化了一个Category类和一个Tag类,为他们的属性name赋值,为了让django帮我们把这些数据保存数据库,调用实例的save()方法即可。
再创建一篇文章,但创建一篇文章之前,我们需要创建一个User,用于指定文章的作者,创建User的命令django帮我们写好了,依然是通过manage.py来运行,首先退出shell,运行以下命令并根据提示创建用户:
注意密码输入的时候看不到的
再次进入python命令行,开始创建文章
from blog.models import Category, Tag, Post
from django.utils import timezone
from django.contrib.auth.models import User
user = User.objects.get(username='djc')
c = Category.objects.get(name='category test')
p = Post(title='title test', body='body test', created_time=timezone.now(), modified_time=timezone.now(), category=c, author=user)
由于我们重启了shell,所以重新导入了Category, Tag, Post,以及User,我们还导入了一个timezone,这是因为我们需要调用它的now()方法为created_time和modified_time提供时间,然后我们根据用户名和分类名,通过get方法取出了数据库中的User和Category,此外还指定了title,body的值,并把它和前面创建的Category c关联了起来,只有允许为空excerpt,tags没有指定值
数据已经存入数据库了,现在把它取出来看看
&&& Category.objects.all()
&QuerySet [&Category: Category object&]&
&&& Tag.objects.all()
&QuerySet [&Tag: Tag object&]&
&&& Post.objects.all()
&QuerySet [&Post: Post object&]&
objects 是我们的模型管理器,它为我们提供一系列从数据库中取数据方法,这里我们使用了 all() 方法,表示我们要把对应的数据全部取出来。可以看到 all() 方法都返回了数据,这些数据应该是我们之前存进去的,但是显示的字符串显示是一个Category object,。为了让显示出来的数据更加友好,我们分别为三个模型增加一个 __str__() 方法:
定义好 __str__() 方法后,解释器显示的内容将会是由 __str__() 方法返回的内容,这里 Category 返回分类名 name,Tag 返回标签名,而 Post 返回它的 title。
&&& from blog.models import Category, Tag, Post
&&& Category.objects.all()
&QuerySet [&Category: category test&]&
&&& Tag.objects.all()
&QuerySet [&Tag: tag test&]&
&&& Post.objects.all()
&QuerySet [&Post: title test&]&
以看到返回的是我们之前存入的数据。此外我们在创建文章时提到了通过 get 方法来获取数据,这里 all 方法和 get 方法的区别是,all 返回全部数据,是一个列表,而 get 返回一条记录数据
尝试修改数据:
&&& c = Category.objects.get(name='category test')
&&& c.name = 'category test new'
&&& c.save()
&&& Category.objects.all()
&QuerySet [&Category: test category new&]&
首先通过 get 方法根据分类名 name 获取到分类,修改它的 name 属性为新的值 category test new,然后调用 save 方法把修改保存到数据库,之后可以看到数据库返回的数据已经是修改后的值了。Tag、Post 的修改也一样。
删除掉数据:
&&& p = Post.objects.get(title='title test')
&Post: title test&
&&& p.delete()
(1, {'blog.Post_tags': 0, 'blog.Post': 1})
&&& Post.objects.all()
&QuerySet []&
先根据标题 title 从数据库中取出 Post,保存在变量 p 中,然后调用它的 delete 方法,最后看到 Post.objects.all() 返回了一个空的 QuerySet(类似于一个列表),表明数据库中没有 Post,Post 已经被删除了。
这就是 django 对数据库增、删、改、查的操作。除了上述演示的方法外,django 还为我们提供了大量其它的方法,这些方法有一部分会在教程中使用,用到时我会讲解它们的用法。但以后你开发自己的项目时,你就需要通过阅读django官方文档来了解有哪些方法已经如何使用它们。
阅读(...) 评论()

我要回帖

更多关于 python 读写数据库 的文章

 

随机推荐