我有麻烦与SQL炼金术既建立模型和选择/插入SQLAlchemy的适当的模型定义和选择/插入
如果我设置的模型如下,并在项目插入表,它的工作原理:
#!/usr/bin/python
import pymysql
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import select
engine = sqlalchemy.create_engine('mysql+pymysql://[email protected]/music?charset=utf8&use_unicode=0', pool_recycle=3600)
connection = engine.connect()
Base = declarative_base(bind=engine)
Base
metadata = MetaData()
directory = Table('directory', metadata,
Column('id', Integer, primary_key=True),
Column('size', Integer),
Column('name', String, unique=True),
)
words = Table('words', metadata,
Column('id', Integer, primary_key=True),
Column('source', Integer, ForeignKey('directory.id')),
Column('words', String),
)
ratios = Table('ratios', metadata,
Column('id', Integer, primary_key=True),
Column('source', Integer, ForeignKey('directory.id')),
Column('target', Integer, ForeignKey('directory.id')),
Column('ratio', Integer),
)
metadata.create_all(engine)
# ---------------------------------------------------------------------
# Execute Insert
# ---------------------------------------------------------------------
i = words.insert().values(words='jack', source=1)
result = connection.execute(i)
不过,如果我使用上述模型,并尝试使用记录的ID选择(如下命令),我没有得到任何结果:
s = directory.select().where(id == 1)
result = connection.execute(s)
for r in result:
print r
表确实有带有该ID的记录,所以它应该返回结果!
如果不是我设置的模型/表如下,使用选择命令(如下),这个工程:
#!/usr/bin/python
import pymysql
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import *
from sqlalchemy import UniqueConstraint
engine = sqlalchemy.create_engine('mysql+pymysql://[email protected]/music?charset=utf8&use_unicode=0', pool_recycle=3600)
connection = engine.connect()
Base = declarative_base(bind=engine)
Base
class Directory(Base):
__tablename__ = "directory"
id = Column(Integer, primary_key=True)
name = Column(String(767), unique=True)
size = Column(Integer)
class Words(Base):
__tablename__ = "words"
id = Column(Integer, primary_key=True)
source = Column(Integer, ForeignKey('directory.id'))
words = Column(String(1500))
class Ratios(Base):
__tablename__ = "ratios"
id = Column(Integer, primary_key=True)
source = Column(Integer, ForeignKey('directory.id'))
target = Column(Integer, ForeignKey('directory.id'))
ratio = Column(Integer)
class Rename(Base):
__tablename__ = "rename"
id = Column(Integer, primary_key=True)
source = Column(Integer, ForeignKey('directory.id'))
name = Column(String(1500))
Base.metadata.create_all()
# ---------------------------------------------------------------------
# Execute Select
# ---------------------------------------------------------------------
s = select([Directory]).where(Directory.id == 1)
result = connection.execute(s)
for r in result:
print r
不过,如果我遵循类似的语法选择一个插入,这并未”将不起作用:
i = insert([Words]).values(source=1, words=out)
connection.execute(i)
问题: 有人可以推荐创建模型的哪种风格是正确的/最佳?
有人可以澄清插入,更新,选择推荐的模型的语法?
有没有一个教程,你可以建议,简洁明了?我一直在浏览SQLAlchemy文档,这真的让人感到困惑 - 我发现了以上两种方式设置模型的示例,但没有找到任何以直观和一致的方式“端对端”的教程。
谢谢。