9

我对 SQLAlchemy 真的很陌生,我喜欢它。现在我正在手动做很多事情,我想做更多“pythonically”和动态的事情。

例如,我有这个简短的脚本,它手动创建/定义一个表,然后是一个将数据插入该表的函数。

数据库连接

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)

insert 函数接受一个字符串和一个列表作为参数

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 的优势所在。有人可以告诉我一个可以概述此过程的好的教程或参考吗?

4

2 回答 2

20

您想改用声明性扩展

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 自己的 ORM 教程

于 2013-05-15T21:31:29.947 回答
0

添加 Automap 扩展:

from sqlalchemy.ext.automap import automap_base

# SQLAlchemy
engine = create_engine(DATABASE_URL)
metadata = MetaData()

Base = automap_base()
Base.prepare(engine, reflect=True)
于 2021-03-24T21:12:28.713 回答