Я действительно новичок в 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]
Так вот сценарий: данный класс объектов
- определить таблицу динамически в зависимости от переменных-членов класса
- номера столбцов и имена должны соответствовать к именам переменных
- или соответствуют индексу этой переменной в списке переменных класса
- написать функцию, которая может вставить данные из класса в соответствующий динамически созданной таблице
Моя интуиция подсказывает мне, что это то, что SQLAlchemy будет хорошо. Может ли кто-нибудь сказать мне хороший учебник или ссылку, которая может описать этот процесс?
Вы имеете в виду [декларативную объектно-реляционную конфигурацию] (http://docs.sqlalchemy.org/en/rel_0_8/orm/extensions/declarative.html)? –
Я не уверен, что я имею в виду. Я полный noob для SQLAlchemy. – frankV