我有一个简单的“发票”类,其中包含一个“编号”属性,当用户保存发票时,应用程序必须为其分配该属性。有一些限制:
1) 应用程序是一个(瘦)客户端-服务器应用程序,所以无论分配数字,都必须注意冲突
2)发票也有一个“版本”属性,所以我不能使用简单的 DBMS 级别的自动递增字段
我正在尝试使用自定义类型来构建它,该类型会在每次保存发票时启动。每当 process_bind_param 使用 None 值调用时,它将调用某种单例来确定数量并避免冲突。这是一个体面的解决方案吗?无论如何,我遇到了问题..这是我的自定义类型:
class AutoIncrement(types.TypeDecorator):
impl = types.Unicode
def copy(self):
return AutoIncrement()
def process_bind_param(self, value, dialect):
if not value:
# Must find next autoincrement value
value = "1" # Test value :)
return value
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,当我保存一个 Invoice 并且 AutoIncrement 将“1”设置为其编号的值时,Invoice 实例不会使用新编号更新。这是预期的吗?我错过了什么吗?非常感谢您的时间!
(Python 2.6 上的 SQLA 0.5.3,使用 postgreSQL 8.3)
编辑: Michael Bayer 告诉我这种行为是意料之中的,因为 TypeDecorators 不处理默认值。
如何使用SQLAlchemy表达式语言选择where where condition来检查布尔表达式.例:
select([table]).\
where(and_(table.c.col1 == 'abc',
table.c.is_num is False
))
Run Code Online (Sandbox Code Playgroud)
这不会给出语法错误,但会错误地评估条件.我不能使用== False给出错误.SQLAlchemy Core v.1.0.8
我正在尝试使用Python连接到Oracle服务器。我可以在cx_Oracle中使用它,但是当我尝试使用sqlalchemy连接时会失败。cx_Oracle代码:
import cx_Oracle
import pandas as pd
cx_connection = cx_Oracle.connect(user+'/' + pw + '@' + host + ':' + port + '/' + db)
df = pd.read_sql(my_query, cx_connection)
Run Code Online (Sandbox Code Playgroud)
根据查询执行并从数据库返回数据。如果我尝试使用sqlalchemy进行相同的连接:
import sqlalchemy
engine = sqlalchemy.create_engine('oracle+cx_oracle://' + user + ':' + pw + '@' + host + ':' + port + '/' + db)
sqlalchemy_connection = engine.connect()
Run Code Online (Sandbox Code Playgroud)
我在最后一行收到错误:
DatabaseError:(cx_Oracle.DatabaseError)ORA-12505:TNS:listener当前不知道连接描述符中给出的SID(有关此错误的背景,网址为:http : //sqlalche.me/e/4xp6)
知道是什么问题吗?sqlalchemy不只是使用cx_Oracle吗?有什么解决方法可以将cx_Oracle连接赋予sqlalchemy吗?
我具有TARGET网站数据库和SQLMap 的凭据,可以直接连接到数据库。这是我在Kali Linux上有关SQLMap的命令
sudo sqlmap -d mysql://USER:PASSWORD@TARGET_IP:MySQL_Port/DATABASE
Run Code Online (Sandbox Code Playgroud)
例
sudo sqlmap -d mysql://admin:12345@95.12.45.12:3306/information_schema
Run Code Online (Sandbox Code Playgroud)
但这是我每次都遇到的错误
[CRITICAL] SQLAchemy connection issue ('(_mysql_exceptions.OperationalError)
(1045, "Access denied for user 'admin'@'17.45.65.11' (using password: YES)")')
Run Code Online (Sandbox Code Playgroud)
该IP 17.45.65.11是我的IP ofc,拒绝了
那么我的命令有问题吗?
还是有人知道使用凭证直接连接到目标数据库的更好方法?
我正在尝试使用one_or_none查询方法从数据库中检索记录,但是当我像通常使用该filter_by方法那样传递kwargs时,它说它不希望使用该关键字。
我尝试遍历doc,但是没有方法的参数或示例的描述。
我试图通过使用'Base.metadata.drop_all(bind = engine)'删除架构中的所有现有表,然后重新创建一个新表。但是,该表并没有像我所想的那样被删除,而是将记录追加到了旧表上。我是sqlalchemy的新手,谁能告诉我我在做什么错...谢谢!
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
engine = create_engine("mysql+pymysql://root:pswd@127.0.0.1:3306/bond?charset=utf8", echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base(bind=engine)
Base.metadata.drop_all(bind=engine)
table = Table('TradeHistory', Base.metadata,
Column('Id', Integer, primary_key=True),
Column('trade_date', String(50)),
Column('rem_period', String(50)),
Column('bond_code', String(50)),
Column('bond_name', String(50)),
Column('bond_rating', String(50)),
Column('bond_yield', String(50)),
Column('note', String(50)),
Column('offer', String(50)),
Column('bid', String(50)),
Column('amount', String(50)))
Base.metadata.create_all(bind=engine)
conn.execute(table.insert(), listToWrite)
session.commit()
session.close()
Run Code Online (Sandbox Code Playgroud) 我需要回滚中的事务core.event 'handle_error' (catch 'KeyboardInterrupt'),但是此事件中的参数是ExceptionContext,该怎么做?
我mailtable在后端PostgreSQL数据库中有一个表,并且正在使用SQLAlchemy ORM使用给定的查询它mailId。对于以下代码,amEngine已经设置了。当到达该mailRow.usercomment = 'Hello World'行时,它抛出:
AttributeError:无法设置属性
Base = declarative_base()
Base.metadata.reflect(amEngine)
metaAm = MetaData()
metaAm.reflect(bind=amEngine)
mt = metaAm.tables['mailtable']
Session = sessionmaker(bind=amEngine)
amSession = Session()
mailRow = amSession.query(
mt
).filter(
mt.c.id == mailId
).first()
mailAddress = mailRow.address
mailRow.usercomment = 'Hello World'
amSession.flush()
amSession.commit()
Run Code Online (Sandbox Code Playgroud)
我需要阅读该address列(成功)并更新该usercomment列(引发异常)。两列的PostgreSQL类型均为text。我怎样才能做到这一点?我确信这肯定是一个非常简单的问题,但是对于我一生来说,我看不到这个问题。
非常感谢。
在我的课堂上,他们使用了以下代码:
pet = session.query(Pet).filter_by(name="Marshmallow").first()
Run Code Online (Sandbox Code Playgroud)
在.first()这里做什么?
假设我创建了一个这样的表:
table = Table('mytable', metadata,
Column('a', Integer, primary_key=True),
Column('b', Integer, primary_key=True),
)
table.create()
Run Code Online (Sandbox Code Playgroud)
是否保证主键是(a,b)而不是(b,a)?