2013-05-15 19 views
2

我对SQLAlchemy非常陌生,我喜欢它。现在,我正在手动做很多事情,我想更“pythonically”和动态地做事情。基于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

    我不确定我的意思。我是SQLAlchemy的完全noob。 – 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:这是* OP要求的*:一个将表行反映为对象的类定义。您现在可以使用'FilePath'实例并且它们透明地反映数据库行内容。 –

    +0

    Base的AutoMap()是否也适用于动态创建表? http://docs.sqlalchemy.org/en/rel_1_0/orm/extensions/automap.html –

    相关问题