我对 SQLAlchemy 非常陌生,而且我喜欢它。现在我正在手动做很多事情,我想以更“Python方式”和动态地做事情。
作为示例,我有一个简短的脚本,可以手动创建/定义一个表,然后创建一个将数据插入该表的函数。
数据库连接
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 的优势所在。有人可以告诉我一个很好的教程或参考来概述这个过程吗?
您想使用 声明性扩展来代替:
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__()
以及其他方法,然后创建这些方法的实例以插入新行。
添加 Automap 扩展:
from sqlalchemy.ext.automap import automap_base
# SQLAlchemy
engine = create_engine(DATABASE_URL)
metadata = MetaData()
Base = automap_base()
Base.prepare(engine, reflect=True)
你们为什么当你完成构建一个程序并且它已经完成时,最好以编程方式粘贴源代码,例如或帮助其他人。不要自私,记住这里的其他人帮助你完成了你的项目。我将于 2025 年 1 月 1 日开始发布完整的源代码,谢谢你