如何将数组插入数据库?
在我之前的问题中,很多用户希望我提供更多的数据供玩家使用。 所以我开始着手导出所有数据并使用Python进行处理,但后来我意识到:我在哪里可以保留所有这些数据?
那么我决定最好的办法是将它们粘在一个数据库中,所以至少我不必每次都解析原始文件。 但由于我对数据库一无所知,这变得相当混乱。 我尝试了一些教程来创建一个sqlite数据库,添加一个表和字段,并尝试插入我的numpy.arrays,但它不能让它工作。
通常我每只狗的结果如下所示:
所以我有35只不同的狗,每只狗有24次测量。 每个测量本身具有未知数量的接触。 每个测量由一个3D阵列(整个平板的248个框架[255x63])和一个2D阵列(平板每个传感器的最大值[255x63])组成。 在数据库中存储一个值不是问题,但是在那里获取我的二维数组似乎不起作用。
所以我的问题是我应该如何命令这个数据库中,并插入我的数组?
你可能会想要开始一个dogs
表,其中包含每只狗的所有扁平(非数组)数据,每只狗都有一个数据,比如姓名,性别和年龄:
CREATE TABLE `dogs` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(64),
`age` INT UNSIGNED,
`sex` ENUM('Male','Female')
);
从那里,每只狗“有很多”测量,所以你需要一个dog_mesaurements
表来存储24个测量值:
CREATE TABLE `dog_measurements` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`dog_id` INT UNSIGNED NOT NULL,
`paw` ENUM ('Front Left','Front Right','Rear Left','Rear Right'),
`taken_at` DATETIME NOT NULL
);
然后,无论何时进行测量,您都可以INSERT INTO dog_measurements (dog_id,taken_at) VALUES (*?*, NOW());
哪里*? *是dogs
桌上的狗的ID。
然后,您需要表格来存储每个测量的实际帧,如下所示:
CREATE TABLE `dog_measurement_data` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`dog_measurement_id` INT UNSIGNED NOT NULL,
`frame` INT UNSIGNED,
`sensor_row` INT UNSIGNED,
`sensor_col` INT UNSIGNED,
`value` NUMBER
);
这样,对于250帧中的每一帧,您循环遍历63个传感器中的每一个,并将该传感器的值与帧编号一起存储到数据库中:
INSERT INTO `dog_measurement_data` (`dog_measurement_id`,`frame`,`sensor_row`,`sensor_col`,`value`) VALUES
(*measurement_id?*, *frame_number?*, *sensor_row?*, *sensor_col?*, *value?*)
显然替换measurement_id?,frame_number?,sensor_number?,value? 具有真正的价值:-)
所以基本上,每个dog_measurement_data
是给定帧的单个传感器值。 这样,为了获得所有给定帧的所有传感器值,您可以:
SELECT `sensor_row`,sensor_col`,`value` FROM `dog_measurement_data`
WHERE `dog_measurement_id`=*some measurement id* AND `frame`=*some frame number*
ORDER BY `sensor_row`,`sensor_col`
这将为您提供该框架的所有行和列。
Django有一个用于将所有数据库工作封装到Python类中的库,因此,您必须在原始SQL执行某些操作之前,不必混淆原始SQL。 尽管Django是Web应用程序的框架,但您可以自己使用数据库ORM。
使用Django,Josh的模型在Python中看起来像这样:
from django.db import models
class Dog(models.Model):
# Might want to look at storing birthday instead of age.
# If you track age, you probably need another field telling
# you when in the year age goes up by 1... and at that point,
# you're really storing a birthday.
name = models.CharField(max_length=64)
age = models.IntegerField()
genders = [
('M', 'Male'),
('F', 'Female'),
]
gender = models.CharField(max_length=1, choices=genders)
class Measurement(models.Model):
dog = models.ForeignKey(Dog, related_name="measurements")
paws = [
('FL', 'Front Left'),
('FR', 'Front Right'),
('RL', 'Rear Left'),
('RR', 'Rear Right'),
]
paw = models.CharField(max_length=2, choices=paws)
taken_at = models.DateTimeField(default=date, auto_now_add=True)
class Measurement_Point(models.Model):
measurement = models.ForeignKey(Measurement, related_name="data_points")
frame = models.IntegerField()
sensor_row = models.PositiveIntegerField()
sensor_col = models.PositiveIntegerField()
value = models.FloatField()
class Meta:
ordering = ['frame', 'sensor_row', 'sensor_col']
id
字段是自动创建的。
然后你可以做这样的事情:
dog = Dog()
dog.name = "Pochi"
dog.age = 3
dog.gender = 'M'
# dog.gender will return 'M', and dog.get_gender_display() will return 'Male'
dog.save()
# Or, written another way:
dog = Dog.objects.create(name="Fido", age=3, sex='M')
要进行测量:
measurement = dog.measurements.create(paw='FL')
for frame in range(248):
for row in range(255):
for col in range(63):
measurement.data_points.create(frame=frame, sensor_row=row,
sensor_col=col, value=myData[frame][row][col])
最后,要获得一个框架:
# For the sake of argument, assuming the dogs have unique names.
# If not, you'll need some more fields in the Dog model to disambiguate.
dog = Dog.objects.get(name="Pochi", sex='M')
# For example, grab the latest measurement...
measurement = dog.measurements.all().order_by('-taken_at')[0]
# `theFrameNumber` has to be set somewhere...
theFrame = measurement.filter(frame=theFrameNumber).values_list('value')
注意:这将返回元组列表(例如[(1.5,), (1.8,), ... ]
),因为values_list()
可以一次检索多个字段。 我对NumPy并不熟悉,但我可以想象它有一个类似于Matlab的reshape
函数的向量重新映射到矩阵的函数。
我认为你无法弄清楚如何在数据库中放置二维数据。
如果考虑2列之间的关系,可以将其视为第1列为X轴数据,第2列为Y轴数据的二维数据。 对于3D数据也是如此。
最后你的分贝应该是这样的:
Table: Dogs
Columns: DogId, DogName -- contains data for each dog
Table: Measurements
Columns: DogId, MeasurementId, 3D_DataId, 2D_DataId -- contains measurements of each dog
Table: 3D_data
Columns: 3D_DataId, 3D_X, 3D_Y, 3D_Z -- contains all 3D data of a measurement
Table: 2D_data
Columns: 2D_DataId, 2D_X, 2D_Y -- contains all 2D data of a measurement
您也可能想要按顺序存储您的3D数据和2D数据。 在这种情况下,您将不得不添加一个列以在3D数据和2D数据表中存储该订单
链接地址: http://www.djcxy.com/p/26791.html