2013-05-15 4 views
2

Я действительно новичок в SQLAlchemy, и мне это нравится. Прямо сейчас я делаю много вещей вручную, и я хочу делать что-то более «питонно» и динамично.Автоматически строить таблицу базы данных на основе класса с SQLAlchemy

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

подключение к базе данных

import os 
from sqlalchemy import * 
from sqlalchemy import schema, types 
from sqlalchemy.ext.declarative import declarative_base 

db_url = os.environ.get('DATABASE_URL') 
engine = create_engine(db_url) 
Base = declarative_base(engine) 
meta = Base.metadata 

определение таблицы

file_paths = Table('file_paths', meta, 
    Column('table_id', Integer, primary_key = True), 
    Column('fullpath', String(255)), 
    Column('filename', String(255)), 
    Column('extension', String(255)), 
    Column('created', String(255)), 
    Column('modified', String(255)), 
    Column('size', Integer), 
    Column('owner', String(255)), 
    Column('permissions', Integer), 
    mysql_engine='InnoDB', 
) 
file_paths.drop(engine, checkfirst = False) 
file_paths.create(engine, checkfirst = True) 

функция вставки принимает строку и список в качестве аргументов

def push_to_db(fullpath, fileInfo): 
    i = file_paths.insert() 
    i.execute( fullpath = str(fullpath), 
      filename = str(fileInfo[0]), 
      extension = str(fileInfo[1]), 
      created  = str(fileInfo[2]), 
      modified = str(fileInfo[3]), 
      size  = str(fileInfo[4]), 
      owner  = str(fileInfo[5]), 
      permissions = str(fileInfo[6]), 
     ) 

Это работает, но это уродливо и взято прямо из учебника, который я нашел где-то в Интернете. Моя цель - сделать эти операции динамичными.

пример класса

class FileMeta(object): 
    def __init__(self, fullPathFileName, filename): 
     self.fullPathFileName = fullPathFileName 
     self.filename = filename 
     self.extension = os.path.splitext(self.filename)[1].lower() 
     ... 

    def fileMetaList(self): 
     return [self.filename, self.extension, self.created, self.modified,\ 
       self.size, self.owner, self.permissions] 

Так вот сценарий: данный класс объектов

  1. определить таблицу динамически в зависимости от переменных-членов класса
    • номера столбцов и имена должны соответствовать к именам переменных
    • или соответствуют индексу этой переменной в списке переменных класса
  2. написать функцию, которая может вставить данные из класса в соответствующий динамически созданной таблице

Моя интуиция подсказывает мне, что это то, что SQLAlchemy будет хорошо. Может ли кто-нибудь сказать мне хороший учебник или ссылку, которая может описать этот процесс?

+0

Вы имеете в виду [декларативную объектно-реляционную конфигурацию] (http://docs.sqlalchemy.org/en/rel_0_8/orm/extensions/declarative.html)? –

+0

Я не уверен, что я имею в виду. Я полный noob для SQLAlchemy. – frankV

ответ

8

Вы хотите использовать вместо declarative extension:

from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class FilePaths(Base): 
    __tablename__ = 'file_paths' 
    __table_args__ = {'mysql_engine':'InnoDB'} 

    table_id = Column(Integer, primary_key=True) 
    fullpath = Column(String(255)) 
    filename = Column(String(255)) 
    extension = Column(String(255)) 
    created = Column(String(255)) 
    modified = Column(String(255)) 
    size = Column(Integer) 
    owner = Column(String(255)) 
    permissions = Column(Integer) 

Base.metadata.create_all(engine) 

Вы можете определить свои собственные __init__() по мере необходимости, а также другие методы, а затем создать экземпляры этих вставить новые строки.

См. SQLAlchemy's own ORM tutorial.

+0

Почему это решение лучше, чем код афера? – laycat

+0

@laycat: это * то, что ОП задал для *: определение класса, которое отражает строку таблицы как объект. Теперь вы можете использовать экземпляры 'FilePath', и они прозрачно отражают содержимое строки базы данных. –

+0

Может ли AutoMap базы Base() работать и для динамического создания таблиц? http://docs.sqlalchemy.org/en/rel_1_0/orm/extensions/automap.html –

Смежные вопросы