Определение модели SQLAlchemy при исполнении - PullRequest
0 голосов
/ 24 марта 2011

Я пишу ORM, используя Elixir и SQLAlchemy для обработки перемещения данных, подобных электронным таблицам, в SQL.Как правило, содержимое данных, подобных электронным таблицам, неизвестно, и анализ синтаксического анализа (мета) данных, подобных электронным таблицам, выполняется из текстового файла

(пример: перепись публикует данные текущего обследования населения в фиксированнойплоские файлы, сопровождаемые txt-файлом, который описывает содержимое данных, включая спецификацию столбца и документацию для каждого столбца данных)

Как я себе представлял, ORM выглядит примерно так

class DataSet(entity)
    """a collection of many spreadsheet-like files"""
class DataFile(entity)
    """describes a single spreadsheet-like file"""
class Variable(entity)
    """describes a single column in spreadsheet-like file"""

Итак, эта модель описывает содержимое набора плоских файлов, которые находятся на жестком диске.Теперь, если я хочу перевести эти плоские файлы в SQL, я должен

  1. попытаться записать SQL в виде строки и заменить информацию из модели, написанной выше

  2. попытаться определить новую сущность Elixir / SQLAlchemy

  3. какой-то третий вариант

В конце дня, что Я думаю, Я хочу, чтобы все электронные таблицы, такие как файлы данных в SQL, представляли собой таблицы, похожие на электронные таблицы, и магию Elixir / SQLAlchemy для обработки всех метаданных

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

1 Ответ

3 голосов
/ 26 марта 2011

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

Мой совет - перейти к пункту 2), когда вы пытаетесь создать таблицу на основе метаданных, которые выиметь.(пере) прочитайте документы схемы, чтобы увидеть, как вы добавите столбцы программным способом, а затем создадите таблицу:

http://www.sqlalchemy.org/docs/core/schema.html

например,

sqla_metadata = sqlalchemy.schema.MetaData()

type_mapping = {'int': Integer, 'text': String} # etc.
cols = []
for (col_name, col_type) in your_parsed_metadata.fields:
    cols.append(Column(col_name, type_mapping[col_type]))

cols.append(Column('datafile_id', Integer, ForeignKey("datafile.datafile_id"), nullable=False),)
new_table = Table(your_parsed_metadata.tablename, sqla_metadata, *cols)
sqla_metadata.create_all(engine)

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

...