2016-03-07 3 views
0

У меня есть два питона файлы, с которыми я создать базу данных:SQLAlchemy: база данных код создания меньше, чем базы данных

Один содержит все декларации класса, и начинается так:

from sqlalchemy import create_engine, Column, Integer, String, Sequence, Table, ForeignKey, Float, DateTime, ForeignKeyConstraint 
from sqlalchemy.orm import backref, relationship, sessionmaker 
from os import path 

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 

genotype_association = Table('gt_association', Base.metadata, 
    Column('genotypes_id', Integer, ForeignKey('genotypes.id')), 
    Column('animals_id', Integer, ForeignKey('animals.id')) 
) 
treatment_association = Table('tr_association', Base.metadata, 
    Column('chronic_treatments_id', Integer, ForeignKey('chronic_treatments.id')), 
    Column('animals_id', Integer, ForeignKey('animals.id')) 
) 
substance_association = Table('st_association', Base.metadata, 
    Column('substance_administrations_id', Integer, ForeignKey('substance_administrations.id')), 
    Column('solutions_id', Integer, ForeignKey('solutions.id')) 
) 
operator_association = Table('op_association', Base.metadata, 
    Column('operator_id', Integer, ForeignKey('operators.id')), 
    Column('fmri_measurements_id', Integer, ForeignKey('fmri_measurements.id')) 
) 
ingredients_association = Table('ig_association', Base.metadata, 
    Column('solutions_id', Integer, ForeignKey('solutions.id')), 
    Column('ingredients_id', Integer, ForeignKey('ingredients.id')) 
) 
laser_association = Table('ls_association', Base.metadata, 
    Column('laser_stimulation_protocols_id', Integer, ForeignKey('laser_stimulation_protocols.id')), 
    Column('fmri_measurements_id', Integer, ForeignKey('fmri_measurements.id')) 
) 

#general classes: 

class Operator(Base): 
    __tablename__ = "operators" 
    id = Column(Integer, primary_key=True) 
    code = Column(String, unique=True) 
    full_name = Column(String) 
    affiliation = Column(String) 

class MeasurementUnit(Base): 
    __tablename__ = "measurement_units" 
    id = Column(Integer, primary_key=True) 
    code = Column(String, unique=True) 
    long_name = Column(String) 
    siunitx = Column(String) 

class Ingredient(Base): 
    __tablename__ = "ingredients" 
    id = Column(Integer, primary_key=True) 
    code = Column(String, unique=True) 
    name = Column(String) 
    concentration = Column(Float, default=100) 
    concentration_unit_id = Column(String, ForeignKey('measurement_units.id')) 
    concentration_unit = relationship("MeasurementUnit") 
    supplier = Column(String) 
    supplier_id = Column(String) 
    contained = Column(Integer, ForeignKey("ingredients.id")) 
    contains = relationship("Ingredient") 

class Solution(Base): 
    __tablename__ = "solutions" 
    id = Column(Integer, primary_key=True) 
    code = Column(String, unique=True) 
    name = Column(String) 
    supplier = Column(String) 
    supplier_id = Column(String) 
    contains = relationship("Ingredient", secondary=ingredients_association, backref="ingredient_of") 

    def __repr__(self): 
     return "<Solution(name='%s' (long_name='%s'), concentration=%s%s contains: %s)>"\ 
     % (self.name, self.long_name, self.concentration, self.concentration_unit, self.contains) 

Другие импорт файлов классы, и создает некоторые записи, начиная примерно так:

from sqlalchemy import create_engine, literal 
from os import path 
from common_classes import * 
from sqlalchemy.orm import sessionmaker 
from add import loadSession, commit_and_close, double_entry 
from datetime import datetime 

def initialize_main_entries(db_path): 
    session,engine = loadSession(db_path) 

    christ = Operator(code="Chr", full_name="Horea Christian", affiliation="ETH") 

    #Measurement Units 
    s = MeasurementUnit(code="s", long_name="second", siunitx="\\second") 
    session.add(s) 
    g = MeasurementUnit(code="g", long_name="gram", siunitx="\\gram") 
    hz = MeasurementUnit(code="Hz", long_name="hertz", siunitx="\\hertz") 
    session.add(hz) 
    percent = MeasurementUnit(code="%", long_name="percent", siunitx="\\percentt") 
    session.add(percent) 
    mi = MeasurementUnit(code="min", long_name="minute", siunitx="\\arcminute") 
    session.add(mi) 
    mg_l = MeasurementUnit(code="mg/l", long_name="milligram per litre", siunitx="\\milli\\gram\\per\\litre") 
    mg_ml = MeasurementUnit(code="mg/ml", long_name="milligram per millilitre", siunitx="\\milli\\gram\\per\\milli\\litre") 
    mul_g = MeasurementUnit(code="mul/g", long_name="microlitre per gram", siunitx="\\micro\\litre\\per\\gram") 

    #Ingredients 
    flu = Ingredient(name="Fluoxetine Hydrochloride", concentration="2.25", concentration_unit=mg_ml, supplier="Tocris") 
    med = Ingredient(name="Medetomidine", concentration=38.5, concentration_unit=mg_l, supplier="Provert AG, Orion Pharma", supplier_id="DOMITOR") 
    sal = Ingredient(name="Sodium Chloride", concentration=86.535, concentration_unit=mg_ml) 
    sal_flu = Ingredient(name="Sodium Chloride", concentration=997.75, concentration_unit=mg_ml) 
    iso_3 = Ingredient(name="Isoflurane", concentration=3, concentration_unit=percent, supplier="Piramal Healthcare") 
    iso_05 = Ingredient(name="Isoflurane", concentration=0.5, concentration_unit=percent, supplier="Piramal Healthcare") 
    air = Ingredient(name="Air", concentration=80, concentration_unit=percent) 
    oxy = Ingredient(name="Oxygen", concentration=20, concentration_unit=percent) 
    e_air_3 = Ingredient(name="Enriched Air", concentration=97, concentration_unit=percent, contains=[air, oxy]) 
    e_air_05 = Ingredient(name="Enriched Air", concentration=99.5, concentration_unit=percent, contains=[air, oxy]) 
    rnasea10 = Ingredient(name="RNase A", concentration=10, concentration_unit=mg_ml) 

Эти файлы 13KB и 28KB соответственно - в то время как файл Databse они производят 60KB.

Ожидается ли это, или это указывает на то, что моя структура базы данных перепутана?

+1

Размер вашего .py исходного кода не имеет ничего общего с размером базы данных. – Selcuk

+0

Но как информация, которая вписывается в 28 КБ исходного кода на Python (включая все импорт, вызовы функций, синтаксис и комментарии), в конечном итоге занимает 60 КБ в формате .db? Во всяком случае, я бы ожидал, что .db будет лучше использовать пространство. – TheChymera

+0

@ Selzuk, я думаю, размер второго файла может быть пропорционален размеру базы данных, но база данных будет содержать больше таких вещей, как метаданные, поэтому она будет выше для небольших размеров данных. Пожалуйста, поправьте меня, если я ошибаюсь. – adarsh

ответ

1

Файлы базы данных SQLite организованы на страницы (размер страницы по умолчанию составляет, вероятно, 4 КБ), а таблицы или индексы не могут обмениваться страницами. Следовательно, для каждого объекта базы данных вам потребуется как минимум одна страница.

Новые строки смогут использовать свободное пространство на этих страницах, поэтому вставка первых нескольких записей не приведет к увеличению размера файла базы данных.