当我按照本指南尝试SQLAlchemy Relation Example时:基本关系模式
我有这个代码
#!/usr/bin/env python
# encoding: utf-8
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, ForeignKey
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base(bind=engine)
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = relationship("Child")
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
parent = relationship("Parent")
Base.metadata.create_all()
p = Parent()
session.add(p)
session.commit()
c = Child(parent_id=p.id) …
Run Code Online (Sandbox Code Playgroud) 我试图在Flask-SQLAlchemy中建立多对多关系,但似乎我不知道如何填充"多对多标识符数据库".你能帮我理解我做错了什么以及应该怎么看?
class User(db.Model):
__tablename__ = 'users'
user_id = db.Column(db.Integer, primary_key=True)
user_fistName = db.Column(db.String(64))
user_lastName = db.Column(db.String(64))
user_email = db.Column(db.String(128), unique=True)
class Class(db.Model):
__tablename__ = 'classes'
class_id = db.Column(db.Integer, primary_key=True)
class_name = db.Column(db.String(128), unique=True)
Run Code Online (Sandbox Code Playgroud)
然后我的标识符数据库:
student_identifier = db.Table('student_identifier',
db.Column('class_id', db.Integer, db.ForeignKey('classes.class_id')),
db.Column('user_id', db.Integer, db.ForeignKey('users.user_id'))
)
Run Code Online (Sandbox Code Playgroud)
到目前为止,当我尝试将数据插入数据库时,它看起来像这样.
# User
user1 = User(
user_fistName='John',
user_lastName='Doe',
user_email='john@doe.es')
user2 = User(
user_fistName='Jack',
user_lastName='Doe',
user_email='jack@doe.es')
user3 = User(
user_fistName='Jane',
user_lastName='Doe',
user_email='jane@doe.es')
db.session.add_all([user1, user2, user3])
db.session.commit()
# Class
cl1 = Class(class_name='0A')
cl2 = …
Run Code Online (Sandbox Code Playgroud) 如何组合两列并应用过滤器?例如,我想同时搜索"firstname"和"lastname"列.如果只搜索一列,我就是这样做的:
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
Run Code Online (Sandbox Code Playgroud) 我想为Flask应用程序进行迁移.我正在使用Alembic.
但是,我收到以下错误.
Target database is not up to date.
Run Code Online (Sandbox Code Playgroud)
在线,我读到它与此有关. http://alembic.zzzcomputing.com/en/latest/cookbook.html#building-an-up-to-date-database-from-scratch
不幸的是,我不太明白如何让数据库保持最新状态以及我应该在哪里/如何编写链接中给出的代码.如果您有迁移经验,可以帮我解释一下
谢谢
如何检查查询中的数据是否存在?
例如:
users_query = User.query.filter_by(email='x@x.com')
Run Code Online (Sandbox Code Playgroud)
如何检查存在该电子邮件的用户?
现在我检查一下
users_query.count()
Run Code Online (Sandbox Code Playgroud)
但要检查它是否存在.
谢谢!
出于各种原因,我试图从数据库中获取对象集合,并将其传递给另一个未连接到数据库的进程.我的代码看起来像下面的那个,但我一直在
sqlalchemy.exc.UnboundExecutionError: Instance <MyClass at 0x8db7fec> is not bound to a Session; attribute refresh operation cannot proceed
Run Code Online (Sandbox Code Playgroud)
当我尝试在get_list()
方法之外查看列表中的元素时.
def get_list (obj):
sesson = Session()
lst = session.query(MyClass).all()
session.close()
return lst
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用它
def get_list_bis (obj)
session = Session()
return session.query(MyClass).all()
Run Code Online (Sandbox Code Playgroud)
我能够使用元素,但担心会话的状态,因为它没有关闭.
我在这里错过了什么?
我有一个记录,我希望它存在于数据库中,如果它不存在,如果它已存在(主键存在)我希望字段更新到当前状态.这通常称为upsert.
以下不完整的代码片段演示了什么可行,但它似乎过于笨重(特别是如果有更多的列).什么是更好/最好的方式?
Base = declarative_base()
class Template(Base):
__tablename__ = 'templates'
id = Column(Integer, primary_key = True)
name = Column(String(80), unique = True, index = True)
template = Column(String(80), unique = True)
description = Column(String(200))
def __init__(self, Name, Template, Desc):
self.name = Name
self.template = Template
self.description = Desc
def UpsertDefaultTemplate():
sess = Session()
desired_default = Template("default", "AABBCC", "This is the default template")
try:
q = sess.query(Template).filter_by(name = desiredDefault.name)
existing_default = q.one()
except sqlalchemy.orm.exc.NoResultFound:
#default does not exist yet, …
Run Code Online (Sandbox Code Playgroud) 按照我们在如何关闭MySQL中的sqlalchemy连接中所评论的内容,我正在检查SQLAlchemy在我的数据库中创建的连接,并且我无法在不退出Python的情况下关闭它们.
如果我在python控制台中运行此代码,它将保持会话打开,直到我退出python:
from sqlalchemy.orm import sessionmaker
from models import OneTable, get_engine
engine = get_engine(database="mydb")
session = sessionmaker(bind=engine)()
results = session.query(OneTable.company_name).all()
# some work with the data #
session.close()
Run Code Online (Sandbox Code Playgroud)
我发现关闭它的唯一解决方法是engine.dispose()
在最后调用.
根据我上面给出的链接中的评论,我现在的问题是:
engine.dispose()
必要结束会议?session.close()
不够吗?我需要从db获取最后一条记录.我正在使用sqlalchemy.目前,我这样做:
obj = ObjectRes.query.all()
return str(obj[-1].id)
Run Code Online (Sandbox Code Playgroud)
但它的查询太重了.我怎样才能更好地获得最后的记录?
我们使用SQLAlchemy和postgres托管多租户应用程序.我正在考虑从每个租户的单独数据库迁移到具有多个模式的单个数据库.SQLAlchemy本机支持吗?我基本上只是希望每个查询都以预定的模式为前缀...例如
select * from client1.users
Run Code Online (Sandbox Code Playgroud)
而不仅仅是
select * from users
Run Code Online (Sandbox Code Playgroud)
请注意,我想切换特定请求/请求集中的所有表的模式,而不仅仅是单个表.
我想这可以通过自定义查询类来完成,但我无法想象已经有了这样的事情.
sqlalchemy ×10
python ×9
flask ×3
alembic ×1
database ×1
exists ×1
postgresql ×1
session ×1
sql ×1
upsert ×1